7

すべての SOAP 要求と応答をログに記録するための SoapExtension があります。MS Soap Toolkit (OnBase ワークフロー) を使用したアプリケーションからの呼び出しでは問題なく動作します。ただし、html ページで $.ajax() によって行われた呼び出しでは機能しません。次に例を示します。

$.ajax({
    type: "POST",
    url: url,
    data: data,
    contentType: "application/json; charset=utf-8",
    dataType: "json"
});

WebService および ScriptService 属性でマークされた ASP.NET 3.5 WebService を呼び出しています。

[WebService(Namespace = XmlSerializationService.DefaultNamespace)]
[ScriptService]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class DepartmentAssigneeService : WebService
{
    private readonly DepartmentAssigneeController _controller = new DepartmentAssigneeController();

    /// <summary>
    /// Fetches the role items.
    /// </summary>
    /// <returns></returns>
    [WebMethod]
    [SoapLog]
    public ListItem[] FetchDepartmentItems()
    {
        return CreateListItems(_controller.FetchDepartments());
    }
}

SoapExtension と SoapExtensionAttribute の基本は次のとおりです。

public class LoggingSoapExtension : SoapExtension, IDisposable { /*...*/ }

[AttributeUsage(AttributeTargets.Method)]
public sealed class SoapLogAttribute : SoapExtensionAttribute { /*...*/ }

$.ajax() リクエストで LoggingSoapExtension を実行できるようにする何かが欠けていますか?

アップデート

@クリス・ブランズマ

これは、Web サービス (dataType: "json") を介して XML ではなく Json の結果を要求していることが原因である可能性があります。したがって、ScriptService 属性はアクティブ化されていますが、SOAP メッセージは送信されていません。

これで、SoapExtension が機能しない理由がわかりました。ScriptService を使用したトレースに関する提案はありますか? 頭に浮かぶのは、リクエストをログに記録するメソッドを提供する ScriptService 基本クラスだけです。しかし、その後、すべての ScriptService WebService のすべての WebMethod でそのメソッドを呼び出す必要があります (私はかなりの数を持っています)。可能であれば、SoapExtension 属性のようにクリーンでシンプルなものを使用したいと考えています。

4

3 に答える 3

2

私は解決策を見つけました。IHttpModuleを使用することで、あらゆるもの(SOAP、JSON、フォームなど)からのリクエストをログに記録できます。以下の実装では、すべての.asmxおよび.ashxリクエストをログに記録することを選択しました。これは、質問のLoggingSoapExtensionを置き換えます。

public class ServiceLogModule : IHttpModule
{
    private HttpApplication _application;
    private bool _isWebService;
    private int _requestId;
    private string _actionUrl;

    #region IHttpModule Members

    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        _application = context;
        _application.BeginRequest += ContextBeginRequest;
        _application.PreRequestHandlerExecute += ContextPreRequestHandlerExecute;
        _application.PreSendRequestContent += ContextPreSendRequestContent;
    }

    #endregion

    private void ContextPreRequestHandlerExecute(object sender, EventArgs e)
    {
        _application.Response.Filter = new CapturedStream(_application.Response.Filter,
                                                          _application.Response.ContentEncoding);
    }

    private void ContextBeginRequest(object sender, EventArgs e)
    {
        string ext = VirtualPathUtility.GetExtension(_application.Request.FilePath).ToLower();
        _isWebService = ext == ".asmx" || ext == ".ashx";

        if (_isWebService)
        {
            ITraceLog traceLog = TraceLogFactory.Create();
            _actionUrl = _application.Request.Url.PathAndQuery;

            StreamReader reader = new StreamReader(_application.Request.InputStream);
            string message = reader.ReadToEnd();
            _application.Request.InputStream.Position = 0;

            _requestId = traceLog.LogRequest(_actionUrl, message);
        }
    }

    private void ContextPreSendRequestContent(object sender, EventArgs e)
    {
        if (_isWebService)
        {
            CapturedStream stream = _application.Response.Filter as CapturedStream;
            if (stream != null)
            {
                ITraceLog traceLog = TraceLogFactory.Create();
                traceLog.LogResponse(_actionUrl, stream.StreamContent, _requestId);
            }
        }
    }
}

ASP.NETから生成されたHTMLのキャプチャから多額の借用をしました。

于 2009-06-23T19:19:30.940 に答える
0

Fiddler(主にIE用ですが、現在はfirefox用)またはFirebug(firefox用)は、クライアント側の要求と応答を監視するための非常に貴重なツールです。

于 2009-06-22T13:35:03.523 に答える