Службе тестового клиента WCF не удалось вызвать

Я подключаюсь к базе данных IBM.Iseries в приложении С#, используя драйверы 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 также выдает ошибку. Где мне нужно изменить адрес порта


person renjucool    schedule 25.05.2010    source источник
comment
Возникла проблема также без использования доступа к данным IBM. Обычный Hello World также выдает ошибку. Где мне нужно изменить адрес порта.   -  person renjucool    schedule 25.05.2010
comment
Я изменил порт на 8080, после чего ошибка сохраняется.   -  person renjucool    schedule 25.05.2010
comment
Можете ли вы опубликовать соответствующий раздел сервера app.config?   -  person Vitalik    schedule 25.05.2010


Ответы (1)


«Проблема» заключается в том, что вы используете привязку 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.

person Thorarin    schedule 26.05.2010
comment
Мне нужно wsDualHttpBinding, так как службе wcf необходимо взаимодействовать с рабочим процессом Windows в дуплексном режиме. - person renjucool; 26.05.2010
comment
@renjucool: Это имеет смысл, потому что он использует порт 80. Скажите ему использовать другой порт, как показано в конфигурации выше. - person Thorarin; 26.05.2010