asp.net中webservice请求发送原理和过程的初步分析[原]

本文介绍了一种在ASP.NET WebService中监控客户端调用的方法,通过分析HttpContext获取客户端IP及调用方法等信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:作为服务方,需要监控每个调用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。

 

测试代码:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
//客户端调用代码
Write("Client端构建对象开始");
            ws.Service1 s 
= new WSWeb.ws.Service1();
            Write(
"Client端构建对象完毕");

            Write(
"Client端开始调用HelloWorld");
            s.HelloWorld();
            Write(
"Client端调用HelloWorld完毕");

            Write(
"Client端开始调用MyTestMethod");
            s.MyTestMethod(
"sssssssssssssttttt");
            Write(
"Client端调用MyTestMethod完毕");

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 Write("进入服务器端基类构造方法");

            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(
"离开 服务器端基类构造方法");

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值