ProtocolException Unhandled/(405) WCF 不允许的方法;绑定和端点看起来不错
Posted
技术标签:
【中文标题】ProtocolException Unhandled/(405) WCF 不允许的方法;绑定和端点看起来不错【英文标题】:ProtocolException Unhandled/(405) Method not allowed with WCF; Bindings and Endpoints look right though 【发布时间】:2013-08-01 20:45:31 【问题描述】:我只是在学习如何使用 WCF,我正在尝试从头开始编写一个小 HelloWorld 程序(主机和客户端)。每当我的客户尝试使用该服务时,我都会收到ProtocolException Unhandled
,但我不知道为什么。我正在使用 IIS 托管服务。
关于我的设置方式:我正在尽我最大的努力将客户端、代理、主机、服务和合同分开,详见此video 和此article。基本上,我在每个解决方案中都有不同的项目。
这里有一些不同的文件显示我在说什么:
服务
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>, 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
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="HelloWorld.HelloWorldService" behaviorConfiguration="MyServiceTypeBehaviors">
<endpoint address="http://localhost:8002/" binding="basicHttpBinding" contract="HelloWorld.IHelloWorldService"/>
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex"/>
</service>
</services>
</system.serviceModel>
</configuration>
这是客户端附带的我的 app.config:
app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<client>
<endpoint address="http://localhost:8002/" binding="basicHttpBinding" contract="HelloWorld.IHelloWorldService" />
</client>
</system.serviceModel>
</configuration>
我的svc文件很短,只是:
HelloWorldService.svc
<%@ServiceHost Service="HelloWorld.HelloWorldService"%>
我知道该服务正在运行,因为当我在浏览器中导航到 http://localhost:8002/HelloWorldService.svc
时,我会看到显示
您已经创建了一个服务。
要测试此服务,您需要创建一个客户端并使用它来 调用服务。
这就是问题发生的地方:服务使用 IIS 运行,我启动客户端实例,出现带有文本框和按钮的窗口,我输入一些字母,点击按钮,然后程序崩溃,我得到 ProtocolException Unhandled, (405) Method not allowed.
错误发生在代理类的这一行:
return Channel.GetMessage(name);
我一直在努力解决这个问题好几个小时,但我没有取得太大进展。如果有人至少能指出我正确的方向,我将非常感激。
最后一件事:我想从头开始编写客户端和代理,而不使用 svcutil.exe。
【问题讨论】:
更新:我运行了这个命令:"%WINDIR%\Microsoft.Net\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -r 并且错误发生了变化。它在同一行,但现在显示:内容类型 text/html;响应消息的 charset=utf-8 与绑定的内容类型不匹配 (text/xml; charset=utf-8)。如果使用自定义编码器,请确保正确实现 IsContentTypeSupported 方法。 另外,当我使用这个新错误详细信息at this link 的分辨率时,它会切换回我遇到的上一个错误; 405 方法不允许。当我在之前的评论中运行命令时,它再次切换回“内容类型不匹配”错误。也许这会给某人提供额外的线索? 【参考方案1】:当您转到基地址 (.svc) 时,它起作用的原因是这是一个 HTTP GET 操作,用于获取服务的元数据。当您调用服务合同上的方法时,您正在执行 POST 操作,并且很可能您没有启用此功能。根据您所针对的 .NET 版本,它会以红色突出显示其中之一。
【讨论】:
当我导航到 Windows 功能时,已选中 .NET Framework 3.5 及其子文件夹的选项。 .NET Framework 4.5 Advanced Services 没有文件夹。这很奇怪,因为它安装在计算机上(如果我导航到可以卸载程序的菜单,我会看到 Microsoft .NET Framework、Microsoft .NET Framework Multi-Targeting Pack 和 Microsoft .NET Framework SDK)。知道为什么这些选项可能不会出现吗? 这节省了我的时间! 谢谢。也许我只是不太了解 Windows 或 IIS,但这些 Windows 功能设置似乎如此随意、隐蔽且不必要。【参考方案2】:您必须在客户端配置的端点标记中为您的服务指定完整地址。 像这样:
<endpoint address="http://localhost:8002/HelloWorldService.svc" binding="basicHttpBinding" contract="HelloWorld.IHelloWorldService" />
不要忘记在端点标签的地址属性中的服务名称后添加 '.svc' 扩展名。它对我有用。希望您现在能得到解决方案。
客户端配置如下所示:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IService"/>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:61569/Service1.svc" binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_IService" contract="WcfServiceApp.IService1" name="WSHttpBinding_IService"/>
</client>
【讨论】:
【参考方案3】:好的,找到了解决方案,虽然我不完全确定它为什么有效。我猜当您使用 Cassini 或 IIS 或其他任何东西来托管网站时,您不应该在 web.config 文件的端点中指定地址。我所要做的就是将其更改为address=""
,它开始正常工作。请务必确保您的服务器托管服务的端口与您的 app.config 文件中的代码匹配。
【讨论】:
【参考方案4】:您必须在客户端配置的端点标签中为您的服务指定完整地址
address="http://localhost:8002/HelloWorldService.svc",您放置相同的端点配置。
当我被困在地狱中时,它确实对我有用......
【讨论】:
以上是关于ProtocolException Unhandled/(405) WCF 不允许的方法;绑定和端点看起来不错的主要内容,如果未能解决你的问题,请参考以下文章
获取“java.net.ProtocolException:服务器重定向太多次”错误
org.apache.http.ProtocolException:未指定目标主机
java.net.ProtocolException:方法不支持请求正文:GET
org.jboss.remoting3.ProtocolException:打开的频道太多。如何增加渠道
ProtocolException:太多后续请求:Android 中使用 Proguard 和 OkHttp 3.0 的 21 个