Как вы настраиваете WCF для поддержки FaultContracts, когда и хост, и клиент находятся в одном процессе с использованием net.pipe?

Я пытаюсь создать внутрипроцессный модульный тест для взаимодействия моей службы с клиентом, используя привязку net.pipe. Как и хорошая служба WCF, он использует атрибут FaultContractAttribute для операций службы, чтобы выявить возможные ошибки (обернутые исключения) для метаданных. Я хотел бы, чтобы конечные точки клиента и службы были настроены с помощью XML (App.config). Однако всякий раз, когда возникает ошибка, это просто исключение CommunicationException «канал закрыт», а не типизированная ошибка I. ожидал.

System.ServiceModel.CommunicationException: There was an error reading from the pipe: The pipe has been ended. (109, 0x6d). 

Я попытался добавить конечную точку IMetadataExchange для net.pipe, но это не сработало. Я тоже пробовал. То, что было в Vista, потребовало, чтобы я переписал ACL для конечной точки http. Это тоже не сработало.

Пользовательский класс исключения:

public class ValidationException : ApplicationException { }

Это последняя попытка конфигурации, но она выдает «Имя контракта 'IMetadataExchange' не может быть найдено в списке контрактов, реализованных службой»

Любые ссылки на примеры или рекомендации о том, как это сделать, будут оценены.

<system.serviceModel>

  <client>
    <endpoint name="Client"
              contract="IService"
              address="net.pipe://localhost/ServiceTest/"
              binding="netNamedPipeBinding"
              bindingConfiguration="netPipeBindingConfig" />
  </client>

  <services>
    <service
      name="Service"
      behaviorConfiguration="ServiceFaults">
      <host>
        <baseAddresses>
          <add baseAddress="net.pipe://localhost/ServiceTest/"/>
          <add baseAddress="http://localhost/ServiceTest/"/>
        </baseAddresses>
      </host>
      <endpoint
        address=""
        binding="netNamedPipeBinding"
        bindingConfiguration="netPipeBindingConfig"

        name="ServicePipe"
        contract="IService" />
      <endpoint
        address="MEX"
        binding="mexNamedPipeBinding"
        bindingConfiguration="mexNetPipeBindingConfig"
        name="MexUserServicePipe"
        contract="IMetadataExchange" />
    </service>
  </services>

  <bindings>
    <netNamedPipeBinding>
      <binding name="netPipeBindingConfig"
               closeTimeout="00:30:00"
               sendTimeout="00:30:00" />
    </netNamedPipeBinding>
    <mexNamedPipeBinding>
      <binding name="mexNetPipeBindingConfig"></binding>
    </mexNamedPipeBinding>
  </bindings>

  <behaviors>
    <serviceBehaviors>
      <behavior name="ServiceFaults">
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
      <behavior name="MEX">
        <serviceMetadata 
          httpGetEnabled="true"
          httpGetUrl="http://localhost/ServiceTest/MEX"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>

</system.serviceModel>


person Kris    schedule 21.10.2008    source источник


Ответы (4)


Если описанный выше класс ValidationException является классом, который вы используете для ошибок, он может быть источником вашей проблемы. Вы должны получить исключения ошибок из FaultException, потому что оно является сериализуемым. ApplicationException - нет.

Вагнер прав, вам нужно украсить определение операции атрибутом FaultContract, указав ему тип вашего контракта. Вы также должны украсить свой FaultContract атрибутами DataContract и DataMember.

person Joseph DeCarlo    schedule 15.12.2008

Я получил ту же ошибку несколько дней назад.
Я решил создать свой собственный класс (MyFault) и выбросить FaultException с сервера и перехватить их на клиенте. MyFault имеет строковый член, который является сообщением об исключении, которое я хочу, чтобы клиент видел.

Надеюсь, я ясно выразился ... Попробую поискать хороший образец и выложу здесь

person sebagomez    schedule 21.10.2008
comment
здесь! взгляните на это ... msdn.microsoft.com/ en-us / library / - person sebagomez; 21.10.2008
comment
да, я вот и настроил клиент. Однако фактическое выброшенное исключение - это необработанный CommunicationChannelFault без данных. То, что я делаю на стороне сервера, - это настраиваемое исключение ValidationException, в котором данные заполнены ошибками. Это обертывается FaultException ‹ValidationExceptio› (). - person Kris; 21.10.2008

Проблема, скорее всего, заключается в ошибке десериализации или сериализации запроса или ответа. Включите трассировку и просмотрите журнал с помощью svctraceviewer для точной ошибки.

Кроме того, убедитесь, что исключение сбоя помечено [DataContract] и не наследует классы, отличные от [DataContract].

person jezell    schedule 21.10.2008

И последнее, что нужно добавить. Определяют ли ваши операционные контракты используемый ServiceFault?

Насколько я понимаю, вы должны определить, какие ServiceFaults вы используете на уровне операций, и ваша бизнес-логика генерирует FaulException, где T - это ServiceFault, который вы определили.

person Wagner Silveira    schedule 20.11.2008