Asp.net 如何从web服务中获取参数值

Asp.net 如何从web服务中获取参数值,asp.net,web-services,asmx,Asp.net,Web Services,Asmx,我有一个web服务(一个ASP.NET.asmx页面),为了进行调试,我需要记录对web服务的所有调用,包括传入每个调用的所有参数的值。因此,基本上每个WebMethod应该做的第一件事就是记录它的状态,以及传递给它的所有参数值的详细信息 到目前为止还不错。复杂的是,我还需要一种自动获取参数值的方法——有相当多的webmethods具有不同的签名,其中一些方法有多达30个参数,因此针对每个特定参数手动编码可能非常容易出错。我希望能够调用一个方法,该方法查看当前Http上下文,并自动使用该上下文获

我有一个web服务(一个ASP.NET.asmx页面),为了进行调试,我需要记录对web服务的所有调用,包括传入每个调用的所有参数的值。因此,基本上每个WebMethod应该做的第一件事就是记录它的状态,以及传递给它的所有参数值的详细信息

到目前为止还不错。复杂的是,我还需要一种自动获取参数值的方法——有相当多的webmethods具有不同的签名,其中一些方法有多达30个参数,因此针对每个特定参数手动编码可能非常容易出错。我希望能够调用一个方法,该方法查看当前Http上下文,并自动使用该上下文获取和解析客户端传入的任何内容


但我遇到了一个障碍。当我查看HttpContext.Current.Request时,发现表单和QueryString集合都是空的。因此,如果传递给webmethod的参数不在这两个集合中,它们会在哪里?有人知道我如何检索它们吗?

您可以使用并按照示例登录请求,该请求将包含方法名称和参数。

SOAP扩展是更好的选择。下面是另一个以XML形式检索的示例。您所要做的就是解析XML以检索参数名称-值对。

您可以使用AOP技术完成此任务。考虑到这一点,您可以创建如下自定义方面:

[Serializable]
public class TraceAttribute : OnMethodBoundaryAspect
{
    public override void OnEntry(MethodExecutionArgs args)
    {
        Trace.WriteLine(string.Format("Entering {0}", args.Method.Name));

        for (int i = 0; i < args.Arguments.Count; i++)
        {
            Trace.WriteLine(string.Format("    {0}", args.Arguments.GetArgument(i)));
        }
    }
}

顺便说一句,引用“ASMX页面”是不正确的。它们根本不是书页,很有趣的想法。很适合良好的体系结构:-),但最后我发现Http请求对象上的InputStream属性包含所需的XML。所以我用了它,因为这是最简单的方法来完成所谓的快速临时修复。
[WebMethod, Trace]
public string HelloWorld()
{
    return "Hello World";
}