惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
Martin Fowler
Martin Fowler
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
Engineering at Meta
Engineering at Meta
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
罗磊的独立博客
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
D
Docker
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
V2EX

博客园 - Arlen

fusionChart使用手记 asp.net2.0运行时页面编译的跟踪分析 马化腾简历 DataTable.Merge 时出现DataType不致 int32 int64 sql 计算子字符串在父字符串中出现次数的一个非常简单的办法 silver light网站收集 20个免费的SEO网站分析工具 flex asp.net 软件开发人员能力模型 mysql null问题续 log4net配置写入文本和写入数据库(sqlserver-sqlclient,mysql-odbc) 传入自定义业务对象 linux下的一些常用操作(与mysql相关) mysql delete update sql B2B B2C C2C vs.net生成后事件 - Arlen - 博客园 互联网创业五大核心问题:既可致胜也可致命 chrome启动崩溃的解决方案 mysql 创建函数时出现 Error Code : 1418 错误解决办法 SQL Server 2005 Data Mining简介[转]
asp.net中webservice请求发送原理和过程的初步分析[原]
Arlen · 2008-12-03 · via 博客园 - Arlen

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

测试代码:

Code

Code