【问题标题】:Extract SOAP Method from HttpRequest object in C#从 C# 中的 HttpRequest 对象中提取 SOAP 方法
【发布时间】:2013-03-05 15:52:18
【问题描述】:

我有一个每次调用 WebService 时都会调用的日志记录方法,用于记录有关调用的信息。我需要能够提取为记录目的而调用的服务方法名称。

如何仅使用传递给日志记录函数的 HttpRequest 对象来执行此操作?

   public static void LogApiCall(HttpRequest  httpRequest, string resultText = "Success", int resultCode = 0)
   {
      // Need to get the SOAP method named called from httpRequest here...
   }

更新:

这是我最终从接受的答案中使用的代码(稍作修改)。此代码经过测试和验证可以正常工作。

/// <summary>
/// Returns the Soap method name called from the http request object.
/// </summary>
public static string SoapMethod(HttpRequest httpRequest)
{

    var bodyRequest = XDocument.Parse(GetDocumentContents(httpRequest));

    if (bodyRequest.Root == null) 
        return httpRequest.Url.AbsoluteUri; 

    var element = bodyRequest.Root.Elements().Where(e => e.Name.LocalName == "Body").Elements().FirstOrDefault();

    return element != null ? element.Name.LocalName : httpRequest.Url.AbsoluteUri;
}

/// <summary>
/// Converts the input stream to a string for XML parsing.
/// </summary>
private static string GetDocumentContents(HttpRequest request)
{
    string documentContents;

    request.InputStream.Position = 0;
    using (var receiveStream = request.InputStream)
    {
        using (var readStream = new StreamReader(receiveStream, request.ContentEncoding))
        {
            documentContents = readStream.ReadToEnd();
        }
    }

    return documentContents;
}

【问题讨论】:

  • httpRequest的url不会是末尾附加的服务方法名吗?
  • 我也是这么想的,但事实并非如此。方法名称嵌入在 SOAP 标头中。 url 只有 ASMX 文件名。

标签: c# .net web-services soap asmx


【解决方案1】:
public static void LogApiCall(HttpRequest httpRequest, string resultText = "Success", int resultCode = 0)
{

    XDocument bodyRequest = XDocument.Parse(GetDocumentContents(httpRequest));
    string methodName = bodyRequest.Root
                                    .Elements()
                                    .Where(e => e.Name.LocalName == "Body")
                                    .Elements()
                                    .FirstOrDefault().Name.LocalName;
}

private static string GetDocumentContents(HttpRequest request)
{
    string documentContents;
    using (Stream receiveStream = request.InputStream)
    {
        using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
        {
            documentContents = readStream.ReadToEnd();
        }
    }
    return documentContents;
}

【讨论】:

  • 这正是我想要的。谢谢!
猜你喜欢
  • 2020-06-22
  • 2021-12-09
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2020-05-17
相关资源
最近更新 更多