需求:作為服務方,需要監控每個調用webservice的客戶端。需要監控的信息大致如下:客戶端的ip,客戶端調用了哪個類的哪個方法。
於是自己花了點時間對asp.net的webservice機制作了一下探索。
解決方案:
在接口項目中編寫一個所有webservice接口的基類,在此基類的構造方法中,通過分析HttpContext.Current.Request得到想要的信息。
1.ip可以通過HttpContext.Current.Request.UserHostAddress得到
2.調用發哪個方法以及參數等都可以通過分析HttpContext.Current.Request.InputStream得到
這是我用下面的代碼輸出的InputStream的內容:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<MyTestMethod xmlns="http://tempuri.org/">
<msg>abcd</msg>
</MyTestMethod>
</soap:Body>
</soap:Envelope>
看到了吧?調用的方法是MyTestMethod,參數是msg,值是abcd
以下是測試的過程:
先把結論給出:
asp.net的程序在添加對webservice的引用時,客戶端會生成代理proxy類。
客戶端的調用代碼一般類似這樣:
ws.Service1 s = new WSWeb.ws.Service1();
s.HelloWorld();
s.MyTestMethod("sssssssssssssttttt");
1.在ws.Service1 s = new WSWeb.ws.Service1();運行這行時,並不會調用服務器端的構造方法,而是調用本地生成的proxy類的構造方法。
2.只有在運行這行時:s.HelloWorld();才會將方法及參數形成soap,綁定到http,發送到服務器端。此時,先調用服務器端的構造方法,然後調用服務器端的HelloWorld
運行第3行s.MyTestMethod("sssssssssssssttttt");時也是這樣,會先調一下服務器端的構造方法,再調用服務器端的MyTestMethod。