我有一个只允许HTTP GET请求的WCF服务:
[WebInvoke(Method="GET", ResponseFormat=WebMessageFormat.Json)]
public string GetAppData()
使用webHttpBinding
公开服务<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="AppSvcBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
我的客户端配置如下
<system.serviceModel>
<client>
<endpoint address="http://localhost/AppService/Service.svc"
binding="webHttpBinding"
bindingConfiguration="webHttpBindingConfig"
contract="AppSvc.IService"
behaviorConfiguration="AppSvcBehavior"
name="AppSvcClient">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
</client>
<bindings>
<webHttpBinding>
<binding name="webHttpBindingConfig">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="AppSvcBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
我的客户端代码很简单
ServiceClient client = new ServiceClient("AppSvcClient");
String result = client.GetAppData();
执行此代码时出现错误:
远程服务器返回了意外响应:(405)Method Not Allowed。
我和fiddler一起检查过,发现我的客户端正在发送POST消息,而服务期望GET因此出错。
我想知道如何配置客户端,以便向服务发送GET请求。
答案 0 :(得分:1)
使用WebGet而不是WebInvoke
修改强>
首先将您的方法更改为:
[WebInvoke(Method="GET", ResponseFormat=WebMessageFormat.Json,UriTemplate = "/")]
public string GetAppData()
确保在服务器端指定了webhttpbinding。
这可以在服务器端修复它。
备份您的客户端代码。
在客户端删除服务引用。确保删除所有配置。
然后再次添加服务引用。现在好吧。
答案 1 :(得分:0)
我遇到了类似的问题,即客户端上生成的代理服务接口缺少我方法上的WebGet
属性。
我手动添加了属性,它解决了问题。
因此,最好的解决方案似乎是将服务接口提取到单独的程序集中,然后在服务器与其客户端之间共享此程序集。
自动代理生成器似乎有问题。