Публикация 2 конечных точек интерфейса с помощью общих общедоступных методов — операция ссылается на элемент сообщения, который уже был экспортирован.

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

<service name="PT.DataServices.WCFService.PTDataServices" behaviorConfiguration="dataServiceBehavior">
    <endpoint address="PTDataServices" binding="wsHttpBinding" contract="PT.DataServices.WCFService.IPTDataServices" bindingConfiguration="wsHttpBinding1">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>

    <endpoint address="PTDataServicesNoSessions" binding="wsHttpBinding" contract="PT.DataServices.WCFService.IPTDataServicesNoSessions" bindingConfiguration="wsHttpBinding2">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>


    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

    <host>
      <baseAddresses>
        <add baseAddress="http://*/PT6/DataServices/"/>
      </baseAddresses>
    </host>
  </service>

Интерфейс без сессий:

[ServiceContract(
    SessionMode = SessionMode.NotAllowed
)]
public interface IPTDataServicesNoSessions
{
    [OperationContract]
    string GetData(int value);

}

Интерфейс с сессиями:

[ServiceContract(
    SessionMode=SessionMode.Required
)]
public interface IPTDataServices
{
    [OperationContract(IsInitiating = true, IsTerminating = false)]
    DcUser InitSession(string userCode, string passwordEncrypted, string connectionString);

    [OperationContract(IsInitiating = false, IsTerminating = true)]
    int EndSession();

    [OperationContract(IsInitiating = false, IsTerminating = false)]
    string GetData(int value);
}

Ввод: http://localhost/PT6/DataServices/ в браузер возвращает:

Операция PT.DataServices.WCFService.IPTDataServicesNoSessions.GetData ссылается на элемент сообщения [http://tempuri.org/:GetData], который уже был экспортирован из операции PT.DataServices.WCFService.IPTDataServices.GetData.

Я не хочу, чтобы все клиенты использовали разные имена методов в зависимости от конечной точки, которая динамически используется... как я могу сообщить WCF, что можно использовать одни и те же методы на каждом из двух интерфейсов?


person zukanta    schedule 16.08.2012    source источник
comment
Вы восстановили свой сервис? Доступен ли он (работает) для получения от него информации о метаданных?   -  person tsells    schedule 16.08.2012
comment
@tsells Теперь я получаю больше информации, когда набираю balrog/PT6/DataServices в браузере. Поэтому, пожалуйста, смотрите мой отредактированный вопрос.   -  person zukanta    schedule 16.08.2012


Ответы (1)


Сам разобрался. Мне нужно было добавить атрибут пространства имен в мои интерфейсы:

[ServiceContract(
    SessionMode=SessionMode.Required,
    Namespace = "PTDataServices/WithSession"
)]

а также

[ServiceContract(
    SessionMode = SessionMode.NotAllowed,
    Namespace = "PTDataServices/NoSessions"
)]

Это позволило WCF избежать конфликтов имен методов в WSDL для методов с одинаковыми именами в обоих интерфейсах.

person zukanta    schedule 20.08.2012