2011-01-20 8 views
5


私のWCFプロジェクトでは、IDispatchMessageInspectorを実装したので、カスタムヘッダーを使用する必要があります。正直なところ、すべての作品はかなりうまいですが、私はちょっとしたことを気にしています。
問題は、BeforeSendReplyとAfterReceiveRequestの両方が、自分の.svcをページとして開いたり、WCFテストクライアントにサービスをロードしたりしても起動するということです。
最初の質問:この動作は正常ですか?宣言的に(いくつかのweb.configトリック)扱ういくつかの方法がありますか?私はそれを使用して、サービスコールではありませんすべてのコール扱うだから今IDispatchMessageInspector:BeforeSendReply機能の改善

public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     if (reply.Properties.Any(x => x.Key == "httpResponse")) 
      return; 

     MessageHeader header = MessageHeader.CreateHeader("Success", "NS", !reply.IsFault); 
     reply.Headers.Add(header);   
    } 

if (reply.Properties.Any(x => x.Key == "httpResponse")) 
    return; 

をしかし、私は他のいくつかのより良い方法はかなり確信して
は現在、私は次のコードを使用しますその問題を処理します。 だから私の主な質問:説明された状況を処理するより良い方法を提案してください。
ありがとうございます!

UPDATE 1
マイsystem.serviceModelセクション

<system.serviceModel>  
    <services>   
     <service behaviorConfiguration="someBehavior" name="serviceName"> 
      <endpoint address="" binding="basicHttpBinding" contract="my contract" /> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services>  
    <behaviors> 
     <serviceBehaviors>    
      <behavior name="someBehavior"> 
       <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>     
       <serviceDebug includeExceptionDetailInFaults="false"/> 
       <exceptionInspector/>     
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <extensions> 
     <behaviorExtensions> 
      <add name="exceptionInspector" type="class which implements BehaviorExtensionElement" /> 
     </behaviorExtensions> 
    </extensions> 

</system.serviceModel> 

UPDATE 2(ACCEPTED SOLUTION)
私は、問題のいくつかの時間の調査ソースを過ごし、最終的に私は私の解決策のために許容できることがわかりました。
何が見つかりました:
まずはMessageは抽象クラスです。だから毎回BeforeSendReplyは具体的な種類の具体的なメッセージを受け取ります。
最もよく使用されるのは
1)System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.MetadataOnHelpPageMessage - クライアントがsvcをページとして開くことを意味します。結果= svcサービスに関するよくある情報を持つよく知られているHTML形式のページ。この種類の場合reply.Version.EnvelopeEnvelopeVersion.Noneです。
2)メタデータ要求を取得します。これはやや難しい部分であり、MEXを使用するかどうかによって異なります。 MEXを使用すると、要求は.svc/mexエンドポイントに実行され、そのメッセージタイプはSystem.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessageとなり、reply.Version.EnvelopeEnvelopeVersion.Soap12となります。
MEXを使用しない場合、クライアントはwsdlデータを取得する要求をほとんど実行しません。メッセージタイプはXMLSchemaMessageになります。
3)Webメソッドリクエストを実行します。これは私のタイプのリクエストに対してのみ役に立ちます。 System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessageであり、reply.Version.EnvelopeEnvelopeVersion.Soap11に等しい。

私はbasicHttpBindingを使用していますので、SOAPバージョンは1.1です。ですから、私の最終的なコードは、応答がSOAPエンベロープを持っていて、それをチェックしているだけです。

 public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     if(reply.Version.Envelope == EnvelopeVersion.Soap11) 
     {    
      MessageHeader header = MessageHeader.CreateHeader("Success", "NS", !reply.IsFault); 
      reply.Headers.Add(header);   
     } 
    } 

答えて

2

私はIDispatchMessageInspectorは、すべてのメッセージに対して実行するHTTPを含めますことを覚えているようだ:エンベロープが存在し、バージョン1.1を持っている場合場合は、その後私たちは、ウェブメソッドの呼び出しがあり、カスタムヘッダーが追加される可能性があることをかなり確信かもしれ同じエンドポイントに公開されているメタデータへのリクエスト(WSDL)。インスペクタをどのように登録しているのかは言及されていないので、関連性もあります。

それ以外にも、メッセージに含まれている内容を確認してみましたか?たとえば、サービスHTMLページを含むメッセージには、MessageVersion == MessageVersion.Noneが含まれている可能性があります。同様に、メッセージに関連付けられたアクションも有用な場合があります。

+1

私はserviceModelセクションの内容で質問をアップグレードしました。 –

+1

私は容認された解決策で私の質問を更新しました。正しい方向に私を押してくれてありがとう、MessageVersionに関する一般的な情報は一般的に正しいです。 –

関連する問題