0

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;
}
4

1 に答える 1

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;
}
于 2013-03-05T16:19:14.460 に答える