4

net.pipeバインディングを使用して、サービスとクライアントの相互作用のインプロセス単体テストを作成しようとしています。優れたWCFサービスと同様に、サービス操作でFaultContractAttributeを使用して、発生する可能性のある障害(ラップされた例外)をメタデータに公開します。XML (App.config)を使用してクライアントエンドポイントとサービスエンドポイントを構成したいと思います。 ただし、障害がスローされるたびに、それは単にCommunicationExceptionの「パイプが閉じられました」であり、私が期待していた型指定された障害ではありません。

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

net.pipeにIMetadataExchangeエンドポイントを追加しようとしましたが、機能しませんでした。私も試しました。Vista上にあるため、httpエンドポイントのACLをnetshする必要がありました。それもうまくいきませんでした。

カスタム例外クラス:

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>

4

4 に答える 4

2

上記の ValidationException クラスが障害に使用しているクラスである場合、それが問題の原因である可能性があります。Serializable であるため、FaultException からフォルト例外を派生させる必要があります。ApplicationException ではありません。

Wagner の言うとおりです。コントラクトのタイプを指定する FaultContract 属性で操作定義を装飾する必要があります。また、FaultContract を DataContract および DataMember 属性で装飾する必要もあります。

于 2008-12-15T14:14:28.107 に答える
0

最後にもう 1 つ追加します。操作コントラクトは、使用している ServiceFault を定義していますか?

私の理解では、操作レイヤーで使用している ServiceFaults を定義する必要があり、ビジネス ロジックは FaulException をスローします。T は、定義した ServiceFault です。

于 2008-11-20T20:44:45.080 に答える
0

数日前に同じエラーが発生しました。
独自のクラス (MyFault) を作成し、サーバーから FaultException をスローしてクライアントでそれらをキャッチすることを解決しました。MyFault には、クライアントに表示する例外メッセージである文字列メンバーがあります。

私は自分自身を明確にしたことを願っています...素敵なサンプルを探して、ここに投稿します

于 2008-10-21T01:13:17.457 に答える
0

問題は、リクエストまたはレスポンスのデシリアライズまたはシリアライズのエラーである可能性が最も高いです。トレースを有効にし、svctraceviewer でログを表示して正確なエラーを確認します。

また、障害例外が [DataContract] でマークされ、[DataContract] クラスを継承せず、非 [DataContract] クラスであることを確認してください。

于 2008-10-21T02:04:37.883 に答える