Como você configurar o WCF para FaultContracts de apoio onde tanto o anfitrião e cliente estão no mesmo processo utilizando um net.pipe?

StackOverflow https://stackoverflow.com/questions/220401

Pergunta

Eu estou tentando criar um teste de unidade em processo para o meu serviço para interações com o cliente usando net.pipe vinculativo. Como um bom serviço WCF que usa FaultContractAttribute em operações de serviço para expor possíveis falhas (exceções embrulhadas) para metadados. Eu gostaria de ter o cliente e serviços endpoints configurados através de XML (App.config). No entanto, sempre que uma falha é jogado, é apenas um CommunicationException "pipe fechou", e não o digitado falha que eu estava esperando.

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

Eu tentei adicionar endpoint IMetadataExchange para net.pipe, mas que não funcionou. Eu também tentei. Que estar no Vista me obrigado a Netsh a ACL para a http endpoint. Isso também não funcionou.

A classe de exceção personalizada:

public class ValidationException : ApplicationException { }

Esta é a mais recente tentativa de uma configuração, mas ele bombeia para fora "O nome do contrato 'IMetadataExchange' não pôde ser encontrado na lista de contratos implementados pelo serviço"

Todos os links para exemplos ou recomendações sobre como conseguir este feito seria apreciada.

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

Foi útil?

Solução

Se a classe ValidationException você descreve acima é a classe que você está usando para falhas, pode ser a fonte do problema. Você deve derivar suas exceções de falha de FaultException porque é Serializable. ApplicationException não é.

Wagner é certo, você precisa para decorar a sua definição de operação com um atributo FaultContract dando-lhe o tipo de seu contrato. Você também deve decorar seu FaultContract com DataContract e atributos DataMember também.

Outras dicas

Eu tenho que mesmo erro de alguns dias atrás.
Eu resolvi criar minha própria classe (MyFault) e jogando FaultException do servidor e pegar aqueles no cliente. MyFault tem um membro da cadeia de wich é a mensagem de exceção Eu quero que o cliente para ver.

Espero que eu fiz claro ... Vou tentar olhar para uma amostra agradável e eu vou postá-lo aqui

O problema é mais provável um erro desserializar ou serializar o pedido ou resposta. Ativar o rastreio e ver o log com SvcTraceViewer para o erro exato.

Além disso, certifique-se de sua exceção culpa é marcada com [DataContract] e não herda e não [DataContract] classes.

Uma última coisa a acrescentar. Será que os seus contratos de operação definem a ServiceFault eles estão usando?.

O meu entendimento é que você tem que definir qual ServiceFaults seu está usando na camada de operação, e sua lógica de negócios jogar um FaulException onde T é o ServiceFault você definiu.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top