私の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.Envelope
はEnvelopeVersion.None
です。
2)メタデータ要求を取得します。これはやや難しい部分であり、MEXを使用するかどうかによって異なります。 MEXを使用すると、要求は.svc/mexエンドポイントに実行され、そのメッセージタイプはSystem.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage
となり、reply.Version.Envelope
はEnvelopeVersion.Soap12
となります。
MEXを使用しない場合、クライアントはwsdlデータを取得する要求をほとんど実行しません。メッセージタイプはXMLSchemaMessage
になります。
3)Webメソッドリクエストを実行します。これは私のタイプのリクエストに対してのみ役に立ちます。 System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage
であり、reply.Version.Envelope
はEnvelopeVersion.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);
}
}
私はserviceModelセクションの内容で質問をアップグレードしました。 –
私は容認された解決策で私の質問を更新しました。正しい方向に私を押してくれてありがとう、MessageVersionに関する一般的な情報は一般的に正しいです。 –