ProtocolException未处理/(405)WCF不允许的方法; 绑定和端点看起来正确

我正在学习如何使用WCF,我正在尝试从头开始编写一个小的HelloWorld程序(主机和客户端)。 每当我的客户端尝试使用该服务时,我一直收到ProtocolException Unhandled ,我无法弄清楚原因。 我正在使用IIS托管服务。

关于我设置的方式:我正在尽力分离客户端,代理,主机,服务和合同,详见本video和本文所述 。 基本上我在解决方案中为每个项目提供了不同的项目。

这里有一些不同的文件显示我在说什么:

服务

 namespace HelloWorld { public class HelloWorldService : IHelloWorldService { public String GetMessage(String name) { return "Hello World from " + name + "!"; } } } 

合同

 namespace HelloWorld { [ServiceContract] public interface IHelloWorldService { [OperationContract] String GetMessage(String name); } } 

代理

 namespace HelloWorld { public class Proxy : ClientBase, IHelloWorldService { #region IHelloWorldService Members public String GetMessage(String name) { return Channel.GetMessage(name); } #endregion } 

}

客户

 namespace Client { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click_1(object sender, EventArgs e) { Proxy proxy = new Proxy(); MessageBox.Show(proxy.GetMessage(textBox1.Text)); } } 

}

客户端只是一个带有文本框和按钮的表单,它尝试使用文本框中的任何内容作为参数来执行GetMessage()。 还有另一个类实际上创建了表单的实例。

这是我的网站web.config:

Web.config文件

                          

这是我的app.config与客户端:

的app.config

         

我的svc文件很短,只是:

HelloWorldService.svc

  

我知道该服务正在运行,因为当我在浏览器中导航到http://localhost:8002/HelloWorldService.svc ,我得到的屏幕显示

您已创建了一项服务。

要测试此服务,您需要创建一个客户端并使用它来调用该服务。

所以这里出现了障碍:服务正在使用IIS运行,我启动客户端的实例,带有文本框和按钮的窗口出现,我输入一些字母,点击按钮,然后程序崩溃,我获取ProtocolException Unhandled, (405) Method not allowed. 错误发生在Proxy类的这一行:

 return Channel.GetMessage(name); 

我一直在试图解决这个问题几个小时,而且我没有取得多大进展。 如果有人能够至少指出我正确的方向,我将非常感激。

最后一件事:我想从头开始编写客户端和代理,而不使用svcutil.exe。

当你转到基地址(.svc)时它工作的原因是这是一个HTTP GET操作来获取服务的元数据。 当您在服务合同上调用方法时,您正在进行POST操作,而且很可能您没有启用此function。 根据您要定位的.NET版本,将以红色突出显示其中一个。

在此处输入图像描述

您必须在客户端配置的端点标记中指定服务的完整地址。 像这样:

  

不要忘记在端点标记的地址属性中添加服务名称后面的“.svc”扩展名。 它对我有用。 希望你现在能得到解决方案。

客户端配置如下所示:

           

您必须在客户端配置的端点标记中指定服务的完整地址

address =“http:// localhost:8002 / HelloWorldService.svc”,您可以在其中放置相同的端点配置。

当我陷入地狱时,它对我有用…

好的,找到了解决方案,虽然我不完全确定它的工作原理。 我想当你使用Cassini或IIS或任何东西来托管网站时,你不应该在web.config文件中的端点中指定一个地址。 我所要做的就是将它更改为address=""并开始正常工作。 请务必确保服务器托管服务的端口与app.config文件中的代码匹配。