2

アプリケーションから送信される WCF Soap 要求をログに記録していますが、ログに記録しているものと実際にネットワーク経由でサーバーに送信されるものとの間に矛盾があることを発見しました。

ここに私が記録しているものがあります:

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/myinterface</Action>
 </s:Header>
 <s:Body>
    <myinterface xmlns="http://tempuri.org/">
    ...

これが実際に出てくるものです(WireSharkでキャプチャ):

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Body>
   <myinterface xmlns="http://tempuri.org/">
   ...

WireShark キャプチャには、Header または Action 要素がないことがわかります。

ログに記録されたリクエストを SoapUI を介してプッシュしようとしたため、これに気付きました。

このコードを使用してリクエストをログに記録しています:

public class InspectorBehavior : IEndpointBehavior
{
    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(new WCFMessageInspector());
    }

と:

public class WCFMessageInspector : IClientMessageInspector
{ 
    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
    {
        Log(request.ToString());

        return null;
    }

と:

    client.Endpoint.Address = new System.ServiceModel.EndpointAddress(address);
    client.Endpoint.Behaviors.Add(new InspectorBehavior());

上記のような後処理なしで、何が起こっているのかを正確にキャプチャする方法があるかどうかは誰にもわかりませんか?

4

2 に答える 2

0

トランスポート レベルでメッセージをログに記録するようWCF Message Loggingに構成できます。App.config

これにより、できるだけ遅くメッセージをキャプチャする必要があります。

送信メッセージの場合、メッセージがユーザー コードを離れた直後、メッセージが送信される直前にログが記録されます。

<system.diagnostics>
  <sources>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
                 <add name="messages"
                      type="System.Diagnostics.XmlWriterTraceListener"
                      initializeData="c:\logs\messages.svclog" />
        </listeners>
      </source>
    </sources>
</system.diagnostics>

<system.serviceModel>
  <diagnostics>
        <messageLogging 
         logEntireMessage="true" 
         logMalformedMessages="true"
         logMessagesAtServiceLevel="false" 
         logMessagesAtTransportLevel="true"
         maxMessagesToLog="1000"
         maxSizeOfMessageToLog="1000000"/>
  </diagnostics>
</system.serviceModel>
于 2015-07-13T12:46:33.820 に答える
0

カスタム MessageEncoderを介して正確なコンテンツをキャプチャできます。メッセージ インスペクター (IDispatchMessageInspector / IClientMessageInspector) とは異なり、不正な形式の XML データを含む元のバイト コンテンツが表示されます。

ただし、このアプローチを実装するのは少し難しいです。標準のtextMessageEncodingをカスタムバインディング要素としてラップし、そのカスタム バインディングを使用するように構成ファイルを調整する必要があります。

また、私のプロジェクトでそれをどのように行ったかを例として見ることができます- textMessageEncoding のラッピング、エンコーダーのロギング、カスタムバインディング要素、およびconfig

于 2018-07-01T12:35:00.627 に答える