配置WCF客户端以使用HTTP GET使用WCF服务

时间:2011-02-10 16:12:28

标签: c# wcf wcf-binding wcf-client

我有一个只允许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请求。

2 个答案:

答案 0 :(得分:1)

使用WebGet而不是WebInvoke

修改

首先将您的方法更改为:

[WebInvoke(Method="GET", ResponseFormat=WebMessageFormat.Json,UriTemplate = "/")]
public string GetAppData() 

确保在服务器端指定了webhttpbinding。

这可以在服务器端修复它。

备份您的客户端代码。

在客户端删除服务引用。确保删除所有配置。

然后再次添加服务引用。现在好吧。

答案 1 :(得分:0)

我遇到了类似的问题,即客户端上生成的代理服务接口缺少我方法上的WebGet属性。

我手动添加了属性,它解决了问题。

因此,最好的解决方案似乎是将服务接口提取到单独的程序集中,然后在服务器与其客户端之间共享此程序集。

自动代理生成器似乎有问题。