需求:作為服務(wù)方,需要監(jiān)控每個調(diào)用webservice的客戶端。需要監(jiān)控的信息大致客戶端的ip,客戶端調(diào)用了哪個類的哪個方法。
于是自己花了點(diǎn)時間對asp.net的webservice機(jī)制作了一下探索。
解決方案: 在接口項(xiàng)目中編寫一個所有webservice接口的基類,在此基類的構(gòu)造方法中,考試,大提示通過分析HttpContext.Current.Request得到想要的信息。
1.ip可以通過HttpContext.Current.Request.UserHostAddress得到調(diào)用發(fā)哪個方法以及參數(shù)等都可以通過分析HttpContext.Current.Request.InputStream得到
以下是測試的過程:
先把結(jié)論給出:
asp.net的程序在添加對webservice的引用時,客戶端會生成代理proxy類。
客戶端的調(diào)用代碼一般類似這樣:
ws.Service1 s = new WSWeb.ws.Service1();
s.HelloWorld();
s.MyTestMethod("sssssssssssssttttt");
1.在ws.Service1 s = new WSWeb.ws.Service1();運(yùn)行這行時,并不會調(diào)用服務(wù)器端的構(gòu)造方法,而是調(diào)用本地生成的proxy類的構(gòu)造方法。只有在運(yùn)行這行時:s.HelloWorld();才會將方法及參數(shù)形成soap,綁定到http,發(fā)送到服務(wù)器端。此時,先調(diào)用服務(wù)器端的構(gòu)造方法,然后調(diào)用服務(wù)器端的HelloWorld
運(yùn)行第3行s.MyTestMethod("sssssssssssssttttt");時也是這樣,會先調(diào)一下服務(wù)器端的構(gòu)造方法,再調(diào)用服務(wù)器端的MyTestMethod。
測試代碼: Code
//客戶端調(diào)用代碼
Write("Client端構(gòu)建對象開始");
ws.Service1 s = new WSWeb.ws.Service1();
Write("Client端構(gòu)建對象完畢");
Write("Client端開始調(diào)用HelloWorld");
s.HelloWorld();
Write("Client端調(diào)用HelloWorld完畢");
Write("Client端開始調(diào)用MyTestMethod");
s.MyTestMethod("sssssssssssssttttt");
Write("Client端調(diào)用MyTestMethod完畢");
Code
Write("進(jìn)入服務(wù)器端基類構(gòu)造方法");
System.IO.FileInfo fi = new System.IO.FileInfo(PATH);
if (!fi.Exists)
fi.Create();
HttpRequest req = HttpContext.Current.Request;
System.IO.Stream stream = req.InputStream;
stream.Position = 0;
System.IO.StreamReader sr = new System.IO.StreamReader(stream);
StringBuilder sbRequest = new StringBuilder();
String line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
sbRequest.Append(line + "“n");
}
Write(sbRequest.ToString());
Write("離開 服務(wù)器端基類構(gòu)造方法");