SOAPリクエストをログに記録するにはどうすればよいですか?

mahdaeng

私たちのほとんどがすでに知っているように、Visual Studio 2017ではConnected Service、関連するWSDLを使用して、を追加し、必要なSOAPサービスを指すように構成できます。これにより、Reference.cs問題のSOAPサービスとのインターフェースに使用されるプロキシクラスのセットがファイルに作成されます。

プロセスのある時点で(プログラムで)変換されたSOAPをインターセプトして、ターゲットサービスに何が正確に送信されているかを知る方法はありますか?送信されている実際のSOAPをログに記録できる必要があるため、これを尋ねます。そのため、Fiddlerなどの別のアプリケーションを使用することはできません。

Reference.csファイル内のコードを詳しく調べたところ、すべてが抽象化されているため、変換が実際にどこで行われるのかわかりません。

この議論のために、私は次の場所にある非常に単純な無料のSOAPサービスを使用していますhttp//www.dneonline.com/calculator.asmx

生成されたReference.csファイルの内容は、この投稿の最後に示されています。そのコードでAddAsync(...)base.Channel.AddAsync(intA, intB)たとえば、クライアントクラスのメソッドが、CalculatorSoapインターフェイスで定義されているメソッドを呼び出していることがわかります。では、ChannelCalculatorSoapインターフェイスの場合、実際に使用されている具体的なクラスはどこにありますか?これは、非常に多くの抽象化が普及しているという意味の例です。

ここで何が起こっているのかについて、皆さんからのアイデアを聞いてうれしいです(そして感謝しています)。

ありがとうございました。

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     //
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace CalculatorSoapServiceReference
{


    [System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.0.1")]
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="CalculatorSoapServiceReference.CalculatorSoap")]
    public interface CalculatorSoap
    {

        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/Add", ReplyAction="*")]
        System.Threading.Tasks.Task<int> AddAsync(int intA, int intB);

        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/Subtract", ReplyAction="*")]
        System.Threading.Tasks.Task<int> SubtractAsync(int intA, int intB);

        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/Multiply", ReplyAction="*")]
        System.Threading.Tasks.Task<int> MultiplyAsync(int intA, int intB);

        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/Divide", ReplyAction="*")]
        System.Threading.Tasks.Task<int> DivideAsync(int intA, int intB);
    }

    [System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.0.1")]
    public interface CalculatorSoapChannel : CalculatorSoapServiceReference.CalculatorSoap, System.ServiceModel.IClientChannel
    {
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.0.1")]
    public partial class CalculatorSoapClient : System.ServiceModel.ClientBase<CalculatorSoapServiceReference.CalculatorSoap>, CalculatorSoapServiceReference.CalculatorSoap
    {

    /// <summary>
    /// Implement this partial method to configure the service endpoint.
    /// </summary>
    /// <param name="serviceEndpoint">The endpoint to configure</param>
    /// <param name="clientCredentials">The client credentials</param>
    static partial void ConfigureEndpoint(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials);

        public CalculatorSoapClient(EndpointConfiguration endpointConfiguration) : 
                base(CalculatorSoapClient.GetBindingForEndpoint(endpointConfiguration), CalculatorSoapClient.GetEndpointAddress(endpointConfiguration))
        {
            this.Endpoint.Name = endpointConfiguration.ToString();
            ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
        }

        public CalculatorSoapClient(EndpointConfiguration endpointConfiguration, string remoteAddress) : 
                base(CalculatorSoapClient.GetBindingForEndpoint(endpointConfiguration), new System.ServiceModel.EndpointAddress(remoteAddress))
        {
            this.Endpoint.Name = endpointConfiguration.ToString();
            ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
        }

        public CalculatorSoapClient(EndpointConfiguration endpointConfiguration, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(CalculatorSoapClient.GetBindingForEndpoint(endpointConfiguration), remoteAddress)
        {
            this.Endpoint.Name = endpointConfiguration.ToString();
            ConfigureEndpoint(this.Endpoint, this.ClientCredentials);
        }

        public CalculatorSoapClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
                base(binding, remoteAddress)
        {
        }

        public System.Threading.Tasks.Task<int> AddAsync(int intA, int intB)
        {
            return base.Channel.AddAsync(intA, intB);
        }

        public System.Threading.Tasks.Task<int> SubtractAsync(int intA, int intB)
        {
            return base.Channel.SubtractAsync(intA, intB);
        }

        public System.Threading.Tasks.Task<int> MultiplyAsync(int intA, int intB)
        {
            return base.Channel.MultiplyAsync(intA, intB);
        }

        public System.Threading.Tasks.Task<int> DivideAsync(int intA, int intB)
        {
            return base.Channel.DivideAsync(intA, intB);
        }

        public virtual System.Threading.Tasks.Task OpenAsync()
        {
            return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginOpen(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndOpen));
        }

        public virtual System.Threading.Tasks.Task CloseAsync()
        {
            return System.Threading.Tasks.Task.Factory.FromAsync(((System.ServiceModel.ICommunicationObject)(this)).BeginClose(null, null), new System.Action<System.IAsyncResult>(((System.ServiceModel.ICommunicationObject)(this)).EndClose));
        }

        private static System.ServiceModel.Channels.Binding GetBindingForEndpoint(EndpointConfiguration endpointConfiguration)
        {
            if ((endpointConfiguration == EndpointConfiguration.CalculatorSoap))
            {
                System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
                result.MaxBufferSize = int.MaxValue;
                result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
                result.MaxReceivedMessageSize = int.MaxValue;
                result.AllowCookies = true;
                return result;
            }
            if ((endpointConfiguration == EndpointConfiguration.CalculatorSoap12))
            {
                System.ServiceModel.Channels.CustomBinding result = new System.ServiceModel.Channels.CustomBinding();
                System.ServiceModel.Channels.TextMessageEncodingBindingElement textBindingElement = new System.ServiceModel.Channels.TextMessageEncodingBindingElement();
                textBindingElement.MessageVersion = System.ServiceModel.Channels.MessageVersion.CreateVersion(System.ServiceModel.EnvelopeVersion.Soap12, System.ServiceModel.Channels.AddressingVersion.None);
                result.Elements.Add(textBindingElement);
                System.ServiceModel.Channels.HttpTransportBindingElement httpBindingElement = new System.ServiceModel.Channels.HttpTransportBindingElement();
                httpBindingElement.AllowCookies = true;
                httpBindingElement.MaxBufferSize = int.MaxValue;
                httpBindingElement.MaxReceivedMessageSize = int.MaxValue;
                result.Elements.Add(httpBindingElement);
                return result;
            }
            throw new System.InvalidOperationException(string.Format("Could not find endpoint with name \'{0}\'.", endpointConfiguration));
        }

        private static System.ServiceModel.EndpointAddress GetEndpointAddress(EndpointConfiguration endpointConfiguration)
        {
            if ((endpointConfiguration == EndpointConfiguration.CalculatorSoap))
            {
                return new System.ServiceModel.EndpointAddress("http://www.dneonline.com/calculator.asmx");
            }
            if ((endpointConfiguration == EndpointConfiguration.CalculatorSoap12))
            {
                return new System.ServiceModel.EndpointAddress("http://www.dneonline.com/calculator.asmx");
            }
            throw new System.InvalidOperationException(string.Format("Could not find endpoint with name \'{0}\'.", endpointConfiguration));
        }

        public enum EndpointConfiguration
        {

            CalculatorSoap,

            CalculatorSoap12,
        }
    }
}
バット

質問番号3には、MessageInspector拡張機能を使用できます。あり、それを設定する方法の詳細はこちらで

メッセージインスペクタを使用すると、送信要求、受信応答、受信要求、および送信応答のSOAPメッセージを表示、永続化、操作できます。

また、内部動作に関して、WCFはSOAPエンベロープを処理するためにMessageオブジェクトを使用します。あなたはここでそれについてもっと読むことができます

メッセージはチャネルモデルの一部です。ここにはかなりの情報があります

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Spring Bootで無効な404リクエストのリクエストパスをログに記録するにはどうすればよいですか?

分類Dev

リクエストとその期間をログに記録するApolloServerプラグインを作成するにはどうすればよいですか?

分類Dev

squidプロキシにすべてのリクエストをログに記録させるにはどうすればよいですか?

分類Dev

httpリクエストのホストヘッダーをログに記録するにはどうすればよいですか(Spring Boot)

分類Dev

特定のURLのリクエスト全体(ヘッダー、本文など)をログに記録するにはどうすればよいですか?

分類Dev

スワッガー/接続リクエストの本文をログに記録するにはどうすればよいですか?

分類Dev

リクエストPOST本文をFlaskに記録するにはどうすればよいですか?

分類Dev

javascriptのテストをログに記録するにはどうすればよいですか?

分類Dev

SymfonyがDoctrineのSQLクエリをログに記録しないようにするにはどうすればよいですか?

分類Dev

下位レベルがstdoutにログを記録しているときに、カスタムロガーがstderrに対してのみエラー/クリティカルをログに記録するにはどうすればよいですか?

分類Dev

下位レベルがstdoutにログを記録しているときに、カスタムロガーがstderrに対してのみエラー/クリティカルをログに記録するにはどうすればよいですか?

分類Dev

nodejsアプリがクライアント情報をログに記録しないようにするにはどうすればよいですか?

分類Dev

nodejsアプリがクライアント情報をログに記録しないようにするにはどうすればよいですか?

分類Dev

Poltergeist / Capybara / RspecでJavaScriptエラーをログに記録するにはどうすればよいですか?

分類Dev

リストと配列をログに記録するときに改行を挿入するにはどうすればよいですか?

分類Dev

ReactNativeアプリでHTTPPOST応答をログに記録するにはどうすればよいですか?

分類Dev

MongoDB C#Driver 2.0でクエリをログに記録するにはどうすればよいですか?

分類Dev

JasperReports Serverで発生したMySqlクエリをログに記録するにはどうすればよいですか?

分類Dev

Windows IoTでイベントをログに記録するにはどうすればよいですか?

分類Dev

すべてのリクエストをログに記録するように組み込みJettyサーバーを構成するにはどうすればよいですか?

分類Dev

サンバイベントをログに記録するにはどうすればよいですか?

分類Dev

nginxがAmazonRoute 53ヘルスチェックリクエストをログに記録しないようにするにはどうすればよいですか?

分類Dev

スクリプトで赤いエラーが発生した場合にのみイベントログをログに記録するにはどうすればよいですか?

分類Dev

ディレクトリのアクティビティをログに記録するにはどうすればよいですか?

分類Dev

Powershellの最上位ディレクトリのみを削除またはログに記録するにはどうすればよいですか?

分類Dev

django RESTフレームワークで500エラーが発生した場合、すべてのリクエストとレスポンスをログに記録するにはどうすればよいですか?

分類Dev

Mongoid 5のRailsコンソールにすべてのリクエストを記録するにはどうすればよいですか?

分類Dev

ASP.NET Coreのコントローラー以外のクラスからログを記録するにはどうすればよいですか?

分類Dev

コンピュータの記録デバイスのリストをプログラムで取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    Spring Bootで無効な404リクエストのリクエストパスをログに記録するにはどうすればよいですか?

  2. 2

    リクエストとその期間をログに記録するApolloServerプラグインを作成するにはどうすればよいですか?

  3. 3

    squidプロキシにすべてのリクエストをログに記録させるにはどうすればよいですか?

  4. 4

    httpリクエストのホストヘッダーをログに記録するにはどうすればよいですか(Spring Boot)

  5. 5

    特定のURLのリクエスト全体(ヘッダー、本文など)をログに記録するにはどうすればよいですか?

  6. 6

    スワッガー/接続リクエストの本文をログに記録するにはどうすればよいですか?

  7. 7

    リクエストPOST本文をFlaskに記録するにはどうすればよいですか?

  8. 8

    javascriptのテストをログに記録するにはどうすればよいですか?

  9. 9

    SymfonyがDoctrineのSQLクエリをログに記録しないようにするにはどうすればよいですか?

  10. 10

    下位レベルがstdoutにログを記録しているときに、カスタムロガーがstderrに対してのみエラー/クリティカルをログに記録するにはどうすればよいですか?

  11. 11

    下位レベルがstdoutにログを記録しているときに、カスタムロガーがstderrに対してのみエラー/クリティカルをログに記録するにはどうすればよいですか?

  12. 12

    nodejsアプリがクライアント情報をログに記録しないようにするにはどうすればよいですか?

  13. 13

    nodejsアプリがクライアント情報をログに記録しないようにするにはどうすればよいですか?

  14. 14

    Poltergeist / Capybara / RspecでJavaScriptエラーをログに記録するにはどうすればよいですか?

  15. 15

    リストと配列をログに記録するときに改行を挿入するにはどうすればよいですか?

  16. 16

    ReactNativeアプリでHTTPPOST応答をログに記録するにはどうすればよいですか?

  17. 17

    MongoDB C#Driver 2.0でクエリをログに記録するにはどうすればよいですか?

  18. 18

    JasperReports Serverで発生したMySqlクエリをログに記録するにはどうすればよいですか?

  19. 19

    Windows IoTでイベントをログに記録するにはどうすればよいですか?

  20. 20

    すべてのリクエストをログに記録するように組み込みJettyサーバーを構成するにはどうすればよいですか?

  21. 21

    サンバイベントをログに記録するにはどうすればよいですか?

  22. 22

    nginxがAmazonRoute 53ヘルスチェックリクエストをログに記録しないようにするにはどうすればよいですか?

  23. 23

    スクリプトで赤いエラーが発生した場合にのみイベントログをログに記録するにはどうすればよいですか?

  24. 24

    ディレクトリのアクティビティをログに記録するにはどうすればよいですか?

  25. 25

    Powershellの最上位ディレクトリのみを削除またはログに記録するにはどうすればよいですか?

  26. 26

    django RESTフレームワークで500エラーが発生した場合、すべてのリクエストとレスポンスをログに記録するにはどうすればよいですか?

  27. 27

    Mongoid 5のRailsコンソールにすべてのリクエストを記録するにはどうすればよいですか?

  28. 28

    ASP.NET Coreのコントローラー以外のクラスからログを記録するにはどうすればよいですか?

  29. 29

    コンピュータの記録デバイスのリストをプログラムで取得するにはどうすればよいですか?

ホットタグ

アーカイブ