Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C中的HttpRequest对象中提取SOAP方法#_C#_.net_Web Services_Soap_Asmx - Fatal编程技术网

C# 从C中的HttpRequest对象中提取SOAP方法#

C# 从C中的HttpRequest对象中提取SOAP方法#,c#,.net,web-services,soap,asmx,C#,.net,Web Services,Soap,Asmx,我有一个日志方法,每次调用Web服务时都会调用它,并用于记录有关调用的信息。我需要能够提取为日志目的调用的服务方法名称 我如何仅使用传递到日志函数的HttpRequest对象来实现这一点 public static void LogApiCall(HttpRequest httpRequest, string resultText = "Success", int resultCode = 0) { // Need to get the SOAP method name

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

我如何仅使用传递到日志函数的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;
}
//
///返回从http请求对象调用的Soap方法名称。
/// 
公共静态字符串SoapMethod(HttpRequest HttpRequest)
{
var bodyRequest=XDocument.Parse(GetDocumentContents(httpRequest));
if(bodyRequest.Root==null)
返回httpRequest.Url.AbsoluteUri;
var element=bodyRequest.Root.Elements()。其中(e=>e.Name.LocalName==“Body”).Elements().FirstOrDefault();
返回元素!=null?element.Name.LocalName:httpRequest.Url.AbsoluteUri;
}
/// 
///将输入流转换为字符串以进行XML解析。
/// 
私有静态字符串GetDocumentContents(HttpRequest请求)
{
字符串文档内容;
request.InputStream.Position=0;
使用(var receiveStream=request.InputStream)
{
使用(var readStream=newstreamreader(receiveStream,request.ContentEncoding))
{
documentContents=readStream.ReadToEnd();
}
}
返回文件内容;
}

httpRequest的url不包含末尾附加的服务方法名称吗?我也这么认为,但事实并非如此。方法名嵌入在SOAP头中。url只有ASMX文件名。检查:这正是我要找的。谢谢
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;
}