通过webclient调用WCF方法 - HTTP 400 - 错误请求

时间:2012-10-26 01:26:24

标签: wcf uri webclient

我正在使用WCF服务并收到错误消息“远程服务器返回错误:(400)错误请求。”通过WebClient消费时

public class WebClientService : WebClient
            ...
            base.Credentials = CredentialCache.DefaultCredentials;
            base.OpenReadCompleted += new OpenReadCompletedEventHandler(ReadJsonStringAsyncComplete);
            base.OpenReadAsync(new Uri("http://localhost/xxxx.svc/GetData"));
            ...

要使用的WCF服务如下(请注意,两者都存在于同一解决方案中(不同的项目)

合同/接口: -

[OperationContract]
[WebInvoke(Method = "GET", UriTemplate = "/GetData", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
IList<MyType> GetData();

实现: -

public IList<MyType> GetData()
{
    return (new MyTypeRepository()).All.ToList();
}

配置: -

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
  <service name="xxxx.Service.MyService" behaviorConfiguration="DataExtractBehavior">
    <endpoint address="http://localhost:1422/MyService.svc" binding="webHttpBinding" bindingConfiguration="DataExtractBinding" behaviorConfiguration="MyEndpointBehavior" contract="xxxx.Service.Common.IMyService"></endpoint>
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="MyEndpointBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="Default">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" />
      <serviceCredentials>
        <windowsAuthentication allowAnonymousLogons="false" includeWindowsGroups="true" />
      </serviceCredentials>
    </behavior>
    <behavior name="DataExtractBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <etwTracking profileName="EndToEndMonitoring Tracking Profile" />
    </behavior>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
      <etwTracking profileName="EndToEndMonitoring Tracking Profile" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <webHttpBinding>
    <binding name="DataExtractBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows"></transport>
      </security>
    </binding>
  </webHttpBinding>
</bindings>

我可以通过http://localhost:1422/xxxx.svc查看服务定义页面但是我似乎无法调用方法GetData(添加到URI的末尾 - http://localhost:1422/xxxx.svc/GetData

有谁知道为什么我会收到HTTP 400 - 错误请求

非常感谢 特拉维斯

2 个答案:

答案 0 :(得分:2)

相同的代码对我来说很好。更改您的配置设置,如下所示,

  <endpointBehaviors>
    <behavior name="MyEndpointBehavior">
        <webHttp helpEnabled="true" automaticFormatSelectionEnabled="true" />
    </behavior>
  </endpointBehaviors>

使用http://localhost:1422/xxxx.svc/help浏览您的服务,您可以使用GetData操作。现在尝试使用http://localhost:1422/xxxx.svc/GetData它会起作用。

此外,您的应用程序正在另一个端口(除1422之外)运行,如果是这样,请转到您的应用程序(项目) - &gt;属性 - &gt; Web-&gt;特定端口(输入1422)现在尝试这个浏览。

希望这有帮助。

答案 1 :(得分:0)

这个问题完全是我的错 - 我正在向上述服务发出“发布”请求,该请求被视为“获取”请求