C# 从C中的HttpRequest对象中提取SOAP方法#
我有一个日志方法,每次调用Web服务时都会调用它,并用于记录有关调用的信息。我需要能够提取为日志目的调用的服务方法名称 我如何仅使用传递到日志函数的HttpRequest对象来实现这一点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
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;
}