2011-03-01 60 views
2

我有一個Web服務(一個ASP.NET .asmx頁面),並且出於調試目的,我需要將所有調用記錄到webservice,包括傳遞的所有參數的值進入每個通話。所以基本上每個WebMethod應該做的第一件事就是將它的狀態記錄下來,並將所有參數值的細節傳遞給它。如何從Web服務中獲取參數值

到目前爲止這麼好。複雜性在於我也希望獲得參數值的自動化方式 - 有不同簽名的webmethods,其中一些具有多達30個參數,因此對每個特定參數進行手動編碼可能會出現極大的錯誤傾向。我寧願能夠調用一個方法來查看當前的Http上下文,並自動使用它來獲取和分析客戶端傳入的內容。

但我碰到了一個障礙。當我看到HttpContext.Current.Request時,事實證明Form和QueryString集合都是空的。因此,如果傳遞給webmethod的參數不在這兩個集合中,它們將會在哪裏?任何人都知道我如何檢索它們?

+1

順便說一句,這是不正確的引用一個「ASMX頁」。他們根本不是網頁。 – 2011-03-01 20:04:29

回答

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

,然後將其應用到您的Web服務方法:

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

有趣的想法。適合良好的體系結構:-)但最終我發現Http請求對象上的InputStream屬性包含所需的XML。所以我使用了它,因爲它是完成本應該是一個快速臨時修復的最簡單方法。 – PhantomDrummer 2011-03-02 12:33:48

0

SOAP Extentions是更好的選擇。這裏是另一個例子,以SOAP request and SOAP response作爲XML。你所要做的就是解析XML來檢索參數名稱值對。