Как настроить basicHttpBinding для службы WCF - PullRequest
4 голосов
/ 30 июня 2010

У меня есть служба 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 для службы WCF

Теперь, похоже, что XML webHttpBinding работает хорошо, но wsHttpBinding и basicHttpBinding работают не очень хорошо.

Я могу просматривать сервис с помощью: http://localhost:8295/WCFTest/TestService.svc

Я также могу использоватьэта конечная точка добавляет ссылку на службу в проект веб-сайта asp.net и пытается использовать службу, но когда я создаю клиента:

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

В нем говорится, что необходимо указать конечную точку из-за нескольких конечных точек.Я думаю, из-за наличия обоих wsHttp и basicHttp?Как мне указать конечную точку здесь?

Далее я пытаюсь использовать конечную точку basicHttpBinding, добавляя веб-ссылку (не ссылку на службу) на веб-сайт .net 2.0.На данный момент я не могу добавить ссылку и получить ошибку 400.

Итак, я удаляю привязку wsHttp и могу добавить веб-ссылку и использовать службу через клиент .net 2.0.

Как настроить его так, чтобы я мог использовать wsHttpBinding для клиентов, которые могут использовать обычные службы WCF, basicHttpBinding для клиентов, которые могут принимать только старые запросы SOAP, отличные от WCF, и при этом иметь доступ к webHttpBinding для клиентов, которые хотят использоватьобычный xml?

1 Ответ

1 голос
/ 19 апреля 2013

Человек, который разместил эту ссылку (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 (найдено здесь ) и ссылки выше, кажется, что вам не хватает этого в конфигурации вашей службы

<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>

Добавление этого раздела предоставит адрес для использования, тогда как конкретные конечные точки будут использовать адреса относительно предоставленного базового адреса.

...