Не удалось вызвать службу тестирования клиентов WCF - PullRequest
2 голосов
/ 25 мая 2010

Я подключаю базу данных IBM.Iseries в приложении c # с помощью драйверов ADO.NET iSeries. Мой сервис WCF выдает ошибку как

"HTTP не удалось зарегистрировать URL http://+:80/Temporary_Listen_Addresses/771be107-8fa3-46f9-ac01-12c4d503d01e/, поскольку TCP-порт 80 используется другим приложением."

 <system.serviceModel>
<client>
  <endpoint address="http://localhost:8080/Design_Time_Addresses/DataAccessLayer/POEngine/"
    binding="wsDualHttpBinding"  bindingConfiguration="" contract="POServiceReference.IPOEngine"
    name="MyPoBindings">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
  <endpoint address="http://localhost:8080/Design_Time_Addresses/DataAccessLayer/POEngine/"
    binding="wsDualHttpBinding" bindingConfiguration="PoBindings1"
    contract="POServiceReference.IPOEngine" name="PoBindings">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
</client>
<bindings>
  <wsDualHttpBinding>
    <binding name="PoBindings1" closeTimeout="00:01:00" openTimeout="00:01:00"
      receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
      transactionFlow="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
      textEncoding="utf-8" useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00" />
      <security mode="Message">
        <message clientCredentialType="Windows" negotiateServiceCredential="true"
          algorithmSuite="Default" />
      </security>
    </binding>
  </wsDualHttpBinding>
  <wsHttpBinding>
    <binding name="PoBindings" />
  </wsHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="DataAccessLayer.POEngineBehavior"
    name="DataAccessLayer.POEngine">
    <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration=""
      name="PoBindings" contract="DataAccessLayer.IPOEngine">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8080/Design_Time_Addresses/DataAccessLayer/POEngine/" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="NewBehavior" />
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="DataAccessLayer.Service1Behavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
    <behavior name="DataAccessLayer.POEngineBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>  </system.serviceModel>

Наличие проблемы также без использования доступа к данным IBM. Обычный Hello World также выдает ошибку. Где мне нужно изменить адрес порта

1 Ответ

1 голос
/ 26 мая 2010

«Проблема» в том, что вы используете wsDualHttpBinding, предназначенный для дуплексных контрактов (сервер перезванивает клиенту). Вам нужен этот функционал? Если вы это сделаете, вам нужно будет предоставить ему адрес для прослушивания клиентом, указав clientBaseAddress в вашей конфигурации привязки. Кроме того, вам необходимо указать конечной точке использовать конфигурацию привязки PoBindings1.

WCF автоматически добавит GUID к базовому адресу, чтобы гарантировать, что он генерирует уникальный адрес конечной точки, но, конечно, ему нужен номер порта, который он может прослушивать. См. эту страницу MSDN для документации раздела конфигурации. Это должно выглядеть примерно так:

<system.serviceModel>
    <!-- client section omitted -->
    <bindings>
        <wsDualHttpBinding>
            <binding name="PoBindings1"
                     clientBaseAddress="http://localhost:8080/Callbacks/">
                <!-- extra config elements and attributes omitted -->
            </binding>
        </wsDualHttpBinding>
    </bindings>
    <services>
        <service behaviorConfiguration="DataAccessLayer.POEngineBehavior"
            name="DataAccessLayer.POEngine">
            <endpoint address=""
                      binding="wsDualHttpBinding"
                      bindingConfiguration="PoBindings1"
                      name="PoBindings" contract="DataAccessLayer.IPOEngine">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost:8080/Design_Time_Addresses/DataAccessLayer/POEngine/" />
                </baseAddresses>
            </host>
        </service>
    </services>
    <!-- behaviors omitted -->
</system.serviceModel>

Вот как обычно выглядит сервисный контракт, если вы используете дуплексные контракты:

[ServiceContract(CallbackContract = typeof(IMyCallbackContract))]
interface IMyContract
{
    [OperationContract]
    void DoSomething();
}

interface IMyCallbackContract
{
   [OperationContract]
   void OnCallback();
}

Если вам не нужны функции обратного вызова, вы должны использовать WSHttpBinding или одну из других «простых» привязок. Вот список типов привязки, которые поставляются с WCF.

...