【问题标题】:How do I get the parameter values from in a web service如何从 Web 服务中获取参数值
【发布时间】:2023-03-21 12:08:01
【问题描述】:

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

到目前为止一切顺利。复杂之处在于,我还想要一种自动获取参数值的方法——有很多具有不同签名的 web 方法,其中一些具有多达 30 个参数,因此针对每个特定参数手动编码可能会非常容易出错.我宁愿能够调用一个查看当前 Http 上下文并自动使用它来抓取和解析客户端传入的任何内容的方法。

但我遇到了障碍。当我查看 HttpContext.Current.Request 时,发现 Form 和 QueryString 集合都是空的。因此,如果传递给 webmethod 的参数不在这些集合中,它们会在哪里?有谁知道我怎样才能找回它们?

【问题讨论】:

  • 顺便说一句,引用“ASMX 页面”是不正确的。它们根本不是页面。

标签: asp.net web-services asmx


【解决方案1】:

您可以使用 AOP 技术来完成此任务。考虑到PostSharp,您可以像这样创建自定义方面:

[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)));
        }
    }
}

然后将其应用于您的网络服务方法:

[WebMethod, Trace]
public string HelloWorld()
{
    return "Hello World";
}

【讨论】:

  • 有趣的想法。非常适合良好的架构 :-) 但最后我发现 Http 请求对象上的 InputStream 属性包含所需的 XML。所以我使用了它,因为它是完成本应是快速临时修复的最简单方法。
【解决方案2】:

您可以使用SOAP extensions 并按照this post 中的示例记录具有方法名称和参数的请求。

【讨论】:

    【解决方案3】:

    SOAP 扩展是更好的选择。这是另一个将SOAP request and SOAP response 检索为 XML 的示例。您所做的只是解析 XML 以检索参数名称值对。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      相关资源
      最近更新 更多