如何为WCF服务配置basicHttpBinding

时间:2010-06-30 01:41:22

标签: wcf-binding

我有一个WCF服务,我正在尝试使用wcf,旧肥皂和普通xml。该服务称为TestService.svc,配置如下所示:

 <system.serviceModel>
  <behaviors>
   <serviceBehaviors>
    <behavior name="TestServiceBehavior">
     <serviceMetadata httpGetEnabled="true"/>
     <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
   </serviceBehaviors>
   <endpointBehaviors>
    <behavior name="poxBehavior">
     <webHttp/>
    </behavior>
   </endpointBehaviors>
  </behaviors>
  <services>
   <service behaviorConfiguration="TestServiceBehavior" name="TestService">
    <endpoint address="" binding="wsHttpBinding" contract="ITestService">
     <identity>
      <dns value="localhost"/>
     </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
    <endpoint address="xml" binding="webHttpBinding"  behaviorConfiguration="poxBehavior" contract="ITestService"/>
   </service>
  </services>
 </system.serviceModel>

我从另一个问题得到了这个代码: REST / SOAP endpoints for a WCF service

现在,XML webHttpBinding似乎运行良好,但是wsHttpBinding和basicHttpBinding不能很好地工作。

我可以使用以下方式浏览服务: http://localhost:8295/WCFTest/TestService.svc

我也可以使用该端点在asp.net网站项目中添加服务引用并尝试使用该服务,但是当我创建客户端时:

TestService.TestServiceClient mytest = new TestService.TestServiceClient();

它表示由于多个端点而指定端点。我想由于同时拥有wsHttp和basicHttp?如何在此处指定端点?

接下来,我尝试通过向.net 2.0网站添加Web引用(不是服务引用)来使用basicHttpBinding端点。此时我无法添加引用并收到错误400。

接下来,我删除了wsHttp绑定,并能够通过.net 2.0客户端添加Web引用并使用该服务。

如何配置它以便我可以为可以使用普通WCF服务的客户端使用wsHttpBinding,对于只能使用较旧的非WCF SOAP请求的客户端使用basicHttpBinding,并且仍然可以为想要使用普通xml的客户端使用webHttpBinding?

1 个答案:

答案 0 :(得分:1)

发布此链接的人(http://www.codemeit.com/wcf/wcf-restful-pox-json-and-soap-coexist.html)似乎是正确的。但由于这个问题仍然没有答案,我会详细说明一下。

如果您还没有尝试过,我会首先提到您的配置中没有指定要连接的客户端服务的实际地址。

<service behaviorConfiguration="TestServiceBehavior" name="TestService">
  <endpoint address="" binding="wsHttpBinding" contract="ITestService">
    <identity>
      <dns value="localhost"/>
    </identity>
  </endpoint>
  <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
  <endpoint address="xml" binding="webHttpBinding"  behaviorConfiguration="poxBehavior" contract="ITestService"/>
</service>

您的第一个端点

<endpoint address="" binding="wsHttpBinding" contract="ITestService">

根据MSDN上的文档(找到here)和上面的链接,您的服务配置中似乎缺少此信息

<host>
  <baseAddresses>
    <!-- note, choose an available port-->
    <add baseAddress="http://localhost:8295/WCFTest/TestService" />
  </baseAddresses>
</host>

添加它会使您的服务配置看起来像这样

<service behaviorConfiguration="TestServiceBehavior" name="TestService">
  <host>
    <baseAddresses>
      <!-- note, choose an available port-->
      <add baseAddress="http://localhost:81/TestService" />
    </baseAddresses>
  </host>
  <endpoint address="" binding="wsHttpBinding" contract="ITestService">
    <identity>
      <dns value="localhost"/>
    </identity>
  </endpoint>
  <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
  <endpoint address="soap" binding="basicHttpBinding" contract="ITestService"/>
  <endpoint address="xml" binding="webHttpBinding"  behaviorConfiguration="poxBehavior" contract="ITestService"/>
</service>

添加该部分将提供要使用的地址,而特定端点将使用相对于所提供的基址的地址。