本文介绍了如何跟踪 ScriptService WebService 请求?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 SoapExtension,用于记录所有 SOAP 请求和响应.它适用于来自使用 MS Soap Toolkit (OnBase Workflow) 的应用程序的调用.但它不适用于 $.ajax() 在 html 页面上进行的调用.举个例子:

I have a SoapExtension that is intended to log all SOAP requests and responses. It works just fine for calls from an application using the MS Soap Toolkit (OnBase Workflow). But it doesn't work for calls made by $.ajax() on an html page. Here's an example:

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

它正在调用一个标记有 WebService 和 ScriptService 属性的 ASP.NET 3.5 WebService:

It's calling an ASP.NET 3.5 WebService marked with WebService and ScriptService attributes:

[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 的基础知识:

And here are the basics for the SoapExtension and SoapExtensionAttribute:

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

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

我是否缺少允许 LoggingSoapExtension 对 $.ajax() 请求执行的内容?

Am I missing something that would allow LoggingSoapExtension to execute on $.ajax() requests?

更新

@Chris Brandsma

@Chris Brandsma

这可能是因为您通过 Web 服务(数据类型:json")请求的是 Json 结果而不是 XML.因此 ScriptService 属性被激活,但您没有发送 SOAP 消息.

这就是为什么 SoapExtension 不起作用的原因.使用 ScriptService 进行跟踪有什么建议吗?唯一想到的是 ScriptService 基类,它提供了记录请求的方法.但是随后我必须在每个 ScriptService WebService 的每个 WebMethod 中调用该方法(我有很多).如果可能的话,我想使用像 SoapExtension 属性一样干净和简单的东西.

That answers why the SoapExtension isn't working. Any suggestions for tracing with ScriptService? The only thing that comes to mind is a ScriptService base class that provides a method to log a request. But then I'd have to call that method in every WebMethod in every ScriptService WebService (I have quite a few). I'd like to use something as clean and simple as a SoapExtension attribute, if possible.

推荐答案

我找到了解决方案.通过使用 IHttpModule,我可以记录来自任何事物(SOAP、JSON、表单等)的请求.在下面的实现中,我选择记录所有 .asmx 和 .ashx 请求.这取代了问题中的 LoggingSoapExtension.

I found a solution. By using an IHttpModule I can log requests from anything (SOAP, JSON, forms, etc). In the implementation below, I've chosen to log all .asmx and .ashx requests. This replaces LoggingSoapExtension from the question.

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.

这篇关于如何跟踪 ScriptService WebService 请求?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-15 23:08