Wie konfigurieren Sie WCF FaultContracts zu unterstützen, in dem sowohl die Host- und Client im gleichen Prozess ist einen net.pipe mit?

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

Frage

Ich versuche, einen In-Process-Unit-Test für meine Dienst-Client-Interaktionen erstellen mit net.pipe binden. Wie ein guter WCF-Dienst verwendet es FaultContractAttribute auf Service-Operationen mögliche Fehler aufzudecken (gewickelte Ausnahmen) zu Metadaten. Ich möchte die Client- und Service-Endpunkte durch XML konfiguriert haben (App.config). Jedes Mal, wenn ein Fehler ausgelöst wird, ist es nur ein Communication „Rohr wurde geschlossen“, und nicht die typisierte Störung I erwartet wurde.

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

Ich habe versucht, IMetadataExchange Endpunkt für net.pipe Hinzufügen, aber das hat nicht funktioniert. Ich habe auch versucht. Welche Wesen auf Vista erforderlich ich die ACL für den HTTP-Endpunkt netsh. Auch das hat nicht funktioniert.

Die benutzerdefinierte Ausnahmeklasse:

public class ValidationException : ApplicationException { }

Dies ist der letzte Versuch einer Config, aber es pumpt

„Der Vertrag Name‚IMetadataExchange‘konnte nicht durch den Dienst implementiert in der Liste der Verträge gefunden werden“

Jede Links zu Beispielen oder Empfehlungen, wie diese zu tun bekommen würde geschätzt.

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

War es hilfreich?

Lösung

Wenn die Validation Klasse, die Sie oben beschreiben, ist die Klasse, die Sie für Fehler verwenden, kann es die Ursache des Problems sein. Sie sollten Ihre Fehler Ausnahmen von FaultException ableiten, weil es Serializable ist. Application nicht.

Wagner richtig ist, müssen Sie Ihren Betrieb Definition mit einem FaultContract Attribut schmücken sie die Art Ihres Vertrages geben. Sie sollten auch Ihre FaultContract mit Datacontract und Datamember Attribute als auch dekorieren.

Andere Tipps

Ich habe den gleichen Fehler vor ein paar Tagen.
Ich löste meine eigene Klasse erstellen (MyFault) und FaultException vom Server werfen und diejenigen, die in dem Client zu kontrollieren. MyFault hat ein Fadenelement weicht die Ausnahmemeldung ich der Kunden sehen will.

Ich hoffe, dass ich mich klar ... Ich werde versuchen, für eine schöne Probe zu suchen und ich werde es hier posten

Das Problem ist höchstwahrscheinlich ein Fehler Deserialisieren oder die Anforderung oder Antwort Serialisierung. Aktivieren Spur und zeigen Sie das Protokoll mit svctraceviewer für die genauen Fehler.

Also, stellen Sie sicher, dass Ihre Fehlerausnahme mit [Datacontract] markiert ist und nicht erben und nicht [Datacontract] Klassen.

Eine letzte Sache hinzuzufügen. Holen Sie Ihren Betrieb Verträge definieren die ServiceFault sie verwenden?.

Mein Verständnis ist, dass Sie definieren müssen, welche ServiceFaults your're an der Betriebsschicht verwenden und die Business-Logik ein FaulException werfen, wo T die ServiceFault Sie definiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top