Hoe doen jy die instel van WCF te ondersteun FaultContracts waar beide die gasheer en die kliënt is in die dieselfde proses met behulp van'n netto.pyp?

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

Vra

Ek probeer om te skep'n in-proses-eenheid toets vir my diens aan die kliënt interaksie met behulp van die netto.pyp bindend.Soos'n goeie WCF diens gebruik FaultContractAttribute op diens bedrywighede bloot te stel moontlike foute (toegedraai uitsonderings) om die metadata.Ek wil graag die kliënt en diens eindpunte ingestel deur middel van XML (App.config). Egter, wanneer'n fout gegooi, dit is net'n CommunicationException "die pyp het gesluit", en nie die getik Fout wat ek verwag het.

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

Ek het probeer om die Toevoeging van IMetadataExchange eindpunt vir die netto.pyp, maar dit het nie gewerk nie.Ek het ook probeer .Wat om op Vista nodig om my te netsh die ACL vir die http eindpunt.Wat ook nie werk nie.

Die persoonlike uitsondering klas:

public class ValidationException : ApplicationException { }

Dit is die jongste poging om'n config, maar dit pompe uit "Die kontrak naam" IMetadataExchange kon nie gevind word nie in die lys van kontrakte wat deur die diens"

Enige Skakels na voorbeelde of aanbevelings vir hoe om te kry dit gedoen sal waardeer word.

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

Was dit nuttig?

Oplossing

As die ValidationException klas wat jy hierbo beskryf is die klas wat jy gebruik vir foute, kan dit die bron van jou probleem te wees nie. Jy moet jou skuld uitsonderings trek uit FaultException want dit is serialiseerbaar. ApplicationException is nie.

Wagner reg is, moet jy jou operasie definisie versier met 'n FaultContract kenmerk gee dit die tipe van jou kontrak. Jy moet ook jou FaultContract versier met DataContract en DataMember eienskappe sowel.

Ander wenke

Ek het daardie selfde fout 'n paar dae gelede.
Ek opgelos skep my eie klas (MyFault) en gooi FaultException van die bediener en vang diegene in die kliënt. MyFault het 'n string lid daaronder is die uitsondering Boodskap Ek wil die kliënt om te sien.

Ek hoop ek het myself duidelik ... Ek sal probeer om te kyk vir 'n lekker monster en ek sal dit hier plaas

Die probleem is waarskynlik 'n fout deserializing of serializeren die versoek of reaksie. Aktiveer spoor en sien die log met svctraceviewer vir die presiese fout.

Ook, maak seker dat jou uitsondering fout is gemerk met [DataContract] en nie besit en nie [DataContract] klasse.

Een laaste ding by te voeg.Doen jou operasie kontrakte definieer die ServiceFault hulle is met behulp van?.

My begrip is dat jy het om te definieer wat ServiceFaults jou is die gebruik by die operasie laag, en jou besigheid logika gooi'n FaulException waar T is die ServiceFault jy gedefinieer.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top