找回密码
 立即注册
首页 业界区 业界 用Asp.net写自己的服务框架

用Asp.net写自己的服务框架

乐敬 2025-5-29 15:55:06
我的上篇博客【我心目中的Asp.net核心对象】讲述了一些我认为在Asp.net中比较重要的核心对象,以及演示了直接使用它们也能实现一个简单的服务响应。今天,我将继续把我认为Asp.net的另一些重要的内容拿出来与大家一起分享,同时将使用本次所讲述的内容改进上篇博客所演示的那个简单的服务,让它成为一个真正能用的服务框架。
在这篇博客中,不仅会继续演示上次提到的三个核心对象,我还会再引入另二个关键对象,我将用更多实战代码来演示它们如何在一起协同工作,来完成许多常见任务,展现它们的精彩故事,也最终会让它们来实现我的服务框架。因此,这篇博客不仅仅是针对Asp.net的基础技术的讲解,而是更多地以实战形式展示这些核心对象所能发挥的强大功能,以一个不到700行的轻量级服务框架来显示它们的核心价值,才是这篇博客的目标。
首先我要谈的话题是Asp.net的请求处理【管线】,我认为这是Asp.net中最重要的内容了,所有到达Asp.net的请求都要经过管线来处理,不管是WebForms, MVC, WebService, WCF(Asp.net的承载方式),还是其它微软的采用HTTP协议的框架。为什么这些框架都选择要Asp.net做为它们的运行平台呢?
我们可以考虑一下:如果让您从无到有设计一个服务框架,有哪些事件是必须要处理的?
我想有三个最根本的事件要做:1. 监听请求端口,2. 为每个传入的连接请求分配线程来执行具体的响应操作,3. 要把请求的数据读出来,并负责将处理后的响应数据发送给调用者。
这其实是个比较复杂也很枯燥的过程,但每个服务器端程序都需要这些基本功能。幸好IIS和Asp.net可以为我们做好这些事情,所以那些框架选择Asp.net平台就可以省去这些复杂的任务。使用Asp.net平台不仅可以简化设计,它还有着良好的扩展性以满足更多的框架在这个平台上面继续开发,而这个良好扩展性是离不开它的请求处理管线的。
Asp.net是一个功能完善的平台框架,它既提供一些高层次的框架供我们使用,比如:WebForms, MVC, WebService,也提供一些低层次的机制让我们使用,以便于让我们开发有特殊要求的新框架,新解决方案。这个低层次的机制就是请求处理管线,使用这个管线的有二类对象:HttpHandler, HttpModule,控制这条管线工作的对象是:HttpApplication 。通常情况下,我们并不需要直接使用HttpApplication对象,因此本文的主题将主要介绍HttpHandler, HttpModule这二类对象的功能以及如何使用它们。
理解Asp.net管线

管线(Pipeline)这个词也是很有点意思,这个词也形象地说明了每个Asp.net请求的处理过程:请求是在一个管道中,要经过一系列的过程点,这些过程点连接起来也就形成一条线。以上是我对于这个词的理解,如果有误,恳请给予指正。这些一系列的过程点,其实就是由HttpApplication引发的一系列事件,通常可以由HttpModule来订阅,也可以在Global.asax中订阅,这一系列的事件也就构成了一次请求的生命周期。
事件模式,也就是观察者模式。根据【C# 3.0 设计模式】一书中的定义:“观察者模式定义了对象之间的一种联系,使得当一个对象改变状态时,所有其它的对象都可以相应地被通知到。"Asp.net的管线设计正是采用了这种方式,在这个设计模式中,观察者就是许多HttpModule对象,被观察的对象就是每个”请求“,它的状态是由HttpApplication控制,用于描述当前请求的处理阶段,HttpApplication会根据一个特定的顺序修改这个状态,并在每个状态改变后引发相应的事件。Asp.net会为每个请求分配一个HttpApplication对象来引发这些事件,因此可以让一大批观察者了解每个请求的状态,每个观察者也可以在感兴趣的时候修改请求的一些数据。这些与请求相关的数据的也就是我上篇博客中提到的HttpRequest, HttpResponse。正是由于引入了事件机制,Asp.net框架也有了极强的扩展能力。再来看看管线处理请求的过程,我将直接引用MSDN中的原文【IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述】中的片段。
在处理该请求时将由 HttpApplication 类执行以下事件。 希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件。
1. 对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。 有关更多信息,请参见 ValidateRequest 和脚本侵入概述。
2. 如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。
3. 引发 BeginRequest 事件。
4. 引发 AuthenticateRequest 事件。
5. 引发 PostAuthenticateRequest 事件。
6. 引发 AuthorizeRequest 事件。
7. 引发 PostAuthorizeRequest 事件。
8. 引发 ResolveRequestCache 事件。
9. 引发 PostResolveRequestCache 事件。
10. 根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。 如果该请求针对从 Page 类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。
11. 引发 PostMapRequestHandler 事件。
12. 引发 AcquireRequestState 事件。
13. 引发 PostAcquireRequestState 事件。
14. 引发 PreRequestHandlerExecute 事件。
15. 为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 IHttpAsyncHandler.BeginProcessRequest)。 例如,如果该请求针对某页,则当前的页实例将处理该请求。
16. 引发 PostRequestHandlerExecute 事件。
17. 引发 ReleaseRequestState 事件。
18. 引发 PostReleaseRequestState 事件。
19. 如果定义了 Filter 属性,则执行响应筛选。
20. 引发 UpdateRequestCache 事件。
21. 引发 PostUpdateRequestCache 事件。
22. 引发 EndRequest 事件。
23. 引发 PreSendRequestHeaders 事件。
24. 引发 PreSendRequestContent 事件。
如果是IIS7,第10个事件也就是MapRequestHandler事件,而且在EndRequest 事件前,还增加了另二个事件:LogRequest 和 PostLogRequest 事件。
只有当应用程序在 IIS 7.0 集成模式下运行,并且与 .NET Framework 3.0 或更高版本一起运行时,才会支持 MapRequestHandler、LogRequest 和 PostLogRequest 事件。
这里要补充一下:从BeginRequest开始的事件,并不是每个事件都会被触发,因为在整个处理过程中,随时可以调用Response.End()或者有未处理的异常发生而提前结束整个过程。在那些"知名"的事件中,也只有EndRequest事件是肯定会触发的,(部分Module的)BeginRequest有可能也不会被触发。
对于这些管线事件,我只想提醒2个非常重要的地方:
1. 每个请求都将会映射到一个HttpHandler,通常也是处理请求的主要对象。
2. HttpModule可以任意订阅这些事件,在事件处理器中也可以参与修改请求的操作。
这2点也决定了HttpHandler和HttpModule的工作方式。
我找了二张【老图片】,希望能更直观的说明Asp.net管线的处理过程。结合我前面讲述的内容,再品味一下老图片吧。
1.png

2.png

HttpHandler

HttpHandler通常是处理请求的核心对象。绝大多数的的请求都在【第10步】被映射到一个HttpHandler,然后在【第15步】中执行处理过程,因此也常把这类对象称为处理器或者处理程序。我们熟知的Page就是一个处理器,一个ashx文件也是一个处理器,不过ashx显示得更原始,我们还是来看一下ashx通常是个什么样子:
  1. <%@ WebHandler Language="C#" Class="Login" %>
  2. using System;
  3. using System.Web;
  4. public class Login : IHttpHandler {
  5. <httpHandlers>
  6. <httpModules>
  7. <httpModules>
  8. <httpModules>
  9. <httpHandlers>
  10.    
  11. </httpHandlers>
  12. </httpModules>
  13. </httpModules>
  14. </httpModules>
  15. </httpHandlers><httpHandlers>
  16. <httpModules>
  17. <httpModules>
  18. <httpModules>
  19. <httpHandlers>
  20.    
  21. </httpHandlers>
  22. </httpModules>
  23. </httpModules>
  24. </httpModules>
  25. </httpHandlers>
  26. <httpHandlers>
  27. <httpModules>
  28. <httpModules>
  29. <httpModules>
  30. <httpHandlers>
  31.    
  32. </httpHandlers>
  33. </httpModules>
  34. </httpModules>
  35. </httpModules>
  36. </httpHandlers>public void ProcessRequest (HttpContext context) {
  37. <httpHandlers>
  38. <httpModules>
  39. <httpModules>
  40. <httpModules>
  41. <httpHandlers>
  42.    
  43. </httpHandlers>
  44. </httpModules>
  45. </httpModules>
  46. </httpModules>
  47. </httpHandlers><httpHandlers>
  48. <httpModules>
  49. <httpModules>
  50. <httpModules>
  51. <httpHandlers>
  52.    
  53. </httpHandlers>
  54. </httpModules>
  55. </httpModules>
  56. </httpModules>
  57. </httpHandlers>context.Response.ContentType = "text/plain";
  58. <httpHandlers>
  59. <httpModules>
  60. <httpModules>
  61. <httpModules>
  62. <httpHandlers>
  63.    
  64. </httpHandlers>
  65. </httpModules>
  66. </httpModules>
  67. </httpModules>
  68. </httpHandlers><httpHandlers>
  69. <httpModules>
  70. <httpModules>
  71. <httpModules>
  72. <httpHandlers>
  73.    
  74. </httpHandlers>
  75. </httpModules>
  76. </httpModules>
  77. </httpModules>
  78. </httpHandlers>string username = context.Request.Form["name"];
  79. <httpHandlers>
  80. <httpModules>
  81. <httpModules>
  82. <httpModules>
  83. <httpHandlers>
  84.    
  85. </httpHandlers>
  86. </httpModules>
  87. </httpModules>
  88. </httpModules>
  89. </httpHandlers><httpHandlers>
  90. <httpModules>
  91. <httpModules>
  92. <httpModules>
  93. <httpHandlers>
  94.    
  95. </httpHandlers>
  96. </httpModules>
  97. </httpModules>
  98. </httpModules>
  99. </httpHandlers>string password = context.Request.Form["password"];
  100. <httpHandlers>
  101. <httpModules>
  102. <httpModules>
  103. <httpModules>
  104. <httpHandlers>
  105.    
  106. </httpHandlers>
  107. </httpModules>
  108. </httpModules>
  109. </httpModules>
  110. </httpHandlers><httpHandlers>
  111. <httpModules>
  112. <httpModules>
  113. <httpModules>
  114. <httpHandlers>
  115.    
  116. </httpHandlers>
  117. </httpModules>
  118. </httpModules>
  119. </httpModules>
  120. </httpHandlers>if( password == "aaaa" ) {
  121. <httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers><httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers><httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers>System.Web.Security.FormsAuthentication.SetAuthCookie(username, false);
  152. <httpHandlers>
  153. <httpModules>
  154. <httpModules>
  155. <httpModules>
  156. <httpHandlers>
  157.    
  158. </httpHandlers>
  159. </httpModules>
  160. </httpModules>
  161. </httpModules>
  162. </httpHandlers><httpHandlers>
  163. <httpModules>
  164. <httpModules>
  165. <httpModules>
  166. <httpHandlers>
  167.    
  168. </httpHandlers>
  169. </httpModules>
  170. </httpModules>
  171. </httpModules>
  172. </httpHandlers><httpHandlers>
  173. <httpModules>
  174. <httpModules>
  175. <httpModules>
  176. <httpHandlers>
  177.    
  178. </httpHandlers>
  179. </httpModules>
  180. </httpModules>
  181. </httpModules>
  182. </httpHandlers>context.Response.Write("OK");
  183. <httpHandlers>
  184. <httpModules>
  185. <httpModules>
  186. <httpModules>
  187. <httpHandlers>
  188.    
  189. </httpHandlers>
  190. </httpModules>
  191. </httpModules>
  192. </httpModules>
  193. </httpHandlers><httpHandlers>
  194. <httpModules>
  195. <httpModules>
  196. <httpModules>
  197. <httpHandlers>
  198.    
  199. </httpHandlers>
  200. </httpModules>
  201. </httpModules>
  202. </httpModules>
  203. </httpHandlers>}
  204. <httpHandlers>
  205. <httpModules>
  206. <httpModules>
  207. <httpModules>
  208. <httpHandlers>
  209.    
  210. </httpHandlers>
  211. </httpModules>
  212. </httpModules>
  213. </httpModules>
  214. </httpHandlers><httpHandlers>
  215. <httpModules>
  216. <httpModules>
  217. <httpModules>
  218. <httpHandlers>
  219.    
  220. </httpHandlers>
  221. </httpModules>
  222. </httpModules>
  223. </httpModules>
  224. </httpHandlers>else {
  225. <httpHandlers>
  226. <httpModules>
  227. <httpModules>
  228. <httpModules>
  229. <httpHandlers>
  230.    
  231. </httpHandlers>
  232. </httpModules>
  233. </httpModules>
  234. </httpModules>
  235. </httpHandlers><httpHandlers>
  236. <httpModules>
  237. <httpModules>
  238. <httpModules>
  239. <httpHandlers>
  240.    
  241. </httpHandlers>
  242. </httpModules>
  243. </httpModules>
  244. </httpModules>
  245. </httpHandlers><httpHandlers>
  246. <httpModules>
  247. <httpModules>
  248. <httpModules>
  249. <httpHandlers>
  250.    
  251. </httpHandlers>
  252. </httpModules>
  253. </httpModules>
  254. </httpModules>
  255. </httpHandlers>context.Response.Write("用户名或密码不正确。");
  256. <httpHandlers>
  257. <httpModules>
  258. <httpModules>
  259. <httpModules>
  260. <httpHandlers>
  261.    
  262. </httpHandlers>
  263. </httpModules>
  264. </httpModules>
  265. </httpModules>
  266. </httpHandlers><httpHandlers>
  267. <httpModules>
  268. <httpModules>
  269. <httpModules>
  270. <httpHandlers>
  271.    
  272. </httpHandlers>
  273. </httpModules>
  274. </httpModules>
  275. </httpModules>
  276. </httpHandlers>}
  277. <httpHandlers>
  278. <httpModules>
  279. <httpModules>
  280. <httpModules>
  281. <httpHandlers>
  282.    
  283. </httpHandlers>
  284. </httpModules>
  285. </httpModules>
  286. </httpModules>
  287. </httpHandlers>}
  288. <httpHandlers>
  289. <httpModules>
  290. <httpModules>
  291. <httpModules>
  292. <httpHandlers>
  293.    
  294. </httpHandlers>
  295. </httpModules>
  296. </httpModules>
  297. </httpModules>
  298. </httpHandlers>public bool IsReusable {
  299. <httpHandlers>
  300. <httpModules>
  301. <httpModules>
  302. <httpModules>
  303. <httpHandlers>
  304.    
  305. </httpHandlers>
  306. </httpModules>
  307. </httpModules>
  308. </httpModules>
  309. </httpHandlers><httpHandlers>
  310. <httpModules>
  311. <httpModules>
  312. <httpModules>
  313. <httpHandlers>
  314.    
  315. </httpHandlers>
  316. </httpModules>
  317. </httpModules>
  318. </httpModules>
  319. </httpHandlers>get {
  320. <httpHandlers>
  321. <httpModules>
  322. <httpModules>
  323. <httpModules>
  324. <httpHandlers>
  325.    
  326. </httpHandlers>
  327. </httpModules>
  328. </httpModules>
  329. </httpModules>
  330. </httpHandlers><httpHandlers>
  331. <httpModules>
  332. <httpModules>
  333. <httpModules>
  334. <httpHandlers>
  335.    
  336. </httpHandlers>
  337. </httpModules>
  338. </httpModules>
  339. </httpModules>
  340. </httpHandlers><httpHandlers>
  341. <httpModules>
  342. <httpModules>
  343. <httpModules>
  344. <httpHandlers>
  345.    
  346. </httpHandlers>
  347. </httpModules>
  348. </httpModules>
  349. </httpModules>
  350. </httpHandlers>return false;
  351. <httpHandlers>
  352. <httpModules>
  353. <httpModules>
  354. <httpModules>
  355. <httpHandlers>
  356.    
  357. </httpHandlers>
  358. </httpModules>
  359. </httpModules>
  360. </httpModules>
  361. </httpHandlers><httpHandlers>
  362. <httpModules>
  363. <httpModules>
  364. <httpModules>
  365. <httpHandlers>
  366.    
  367. </httpHandlers>
  368. </httpModules>
  369. </httpModules>
  370. </httpModules>
  371. </httpHandlers>}
  372. <httpHandlers>
  373. <httpModules>
  374. <httpModules>
  375. <httpModules>
  376. <httpHandlers>
  377.    
  378. </httpHandlers>
  379. </httpModules>
  380. </httpModules>
  381. </httpModules>
  382. </httpHandlers>}
  383. }
复制代码
可以看到它仅仅是实现一个IHttpHandler接口而已,IHttpHandler接口也很简单:
  1. // 定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定。
  2. public interface IHttpHandler
  3. {
  4. <httpHandlers>
  5. <httpModules>
  6. <httpModules>
  7. <httpModules>
  8. <httpHandlers>
  9.    
  10. </httpHandlers>
  11. </httpModules>
  12. </httpModules>
  13. </httpModules>
  14. </httpHandlers>// 获取一个值,该值指示其他请求是否可以使用 System.Web.IHttpHandler 实例。
  15. <httpHandlers>
  16. <httpModules>
  17. <httpModules>
  18. <httpModules>
  19. <httpHandlers>
  20.    
  21. </httpHandlers>
  22. </httpModules>
  23. </httpModules>
  24. </httpModules>
  25. </httpHandlers>//
  26. <httpHandlers>
  27. <httpModules>
  28. <httpModules>
  29. <httpModules>
  30. <httpHandlers>
  31.    
  32. </httpHandlers>
  33. </httpModules>
  34. </httpModules>
  35. </httpModules>
  36. </httpHandlers>// 返回结果:
  37. <httpHandlers>
  38. <httpModules>
  39. <httpModules>
  40. <httpModules>
  41. <httpHandlers>
  42.    
  43. </httpHandlers>
  44. </httpModules>
  45. </httpModules>
  46. </httpModules>
  47. </httpHandlers>//<httpHandlers>
  48. <httpModules>
  49. <httpModules>
  50. <httpModules>
  51. <httpHandlers>
  52.    
  53. </httpHandlers>
  54. </httpModules>
  55. </httpModules>
  56. </httpModules>
  57. </httpHandlers> 如果 System.Web.IHttpHandler 实例可再次使用,则为 true;否则为 false。
  58. <httpHandlers>
  59. <httpModules>
  60. <httpModules>
  61. <httpModules>
  62. <httpHandlers>
  63.    
  64. </httpHandlers>
  65. </httpModules>
  66. </httpModules>
  67. </httpModules>
  68. </httpHandlers>bool IsReusable { get; }
  69. <httpHandlers>
  70. <httpModules>
  71. <httpModules>
  72. <httpModules>
  73. <httpHandlers>
  74.    
  75. </httpHandlers>
  76. </httpModules>
  77. </httpModules>
  78. </httpModules>
  79. </httpHandlers>// 通过实现 System.Web.IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。
  80. <httpHandlers>
  81. <httpModules>
  82. <httpModules>
  83. <httpModules>
  84. <httpHandlers>
  85.    
  86. </httpHandlers>
  87. </httpModules>
  88. </httpModules>
  89. </httpModules>
  90. </httpHandlers>void ProcessRequest(HttpContext context);
  91. }
复制代码
IsReusable属性上面有注释,我就不说了。接口中最重要的部分就是方法 void ProcessRequest(HttpContext context);这个方法简单地不能再简单,只有一个参数,但这个参数的能量可不小,有了它几乎就有了一切,这就是我对它的评价。关于HttpContext的更多详细介绍请参考我的博客【我心目中的Asp.net核心对象】。
在Login.ashx中,我做了三简单的事:
1. 读取输入数据: 从Request.Form中。
2. 执行特定的业务逻辑: 一个简单的判断。
3. 返回结果给客户端: 调用Response.Write()
是的,就是这三个简单的操作,但也是绝大多数ashx文件的常规写法,它的确可以完成一次请求的处理过程。
记住:事实上任何HttpHandler都是这样处理请求的,只是有时会借助一些框架的包装而变了味道而已。
我认为:HttpHandler的强大离不开HttpContext,HttpHandler的重要性是因为管线会将每个请求都映射到一个HttpHandler。
通常,我们需要新的HttpHandler,创建一个ashx文件就可以了。但也可以创建自己的HttpHandler,或者要将一类【特殊的路径/扩展名】交给某个处理器来处理,那么就需要我们在web.config中注册那个处理器。
注意:如果是【特殊的扩展名】可能还需要在IIS中注册,原因很简单:IIS不将请求交给Asp.net,我们的代码根本没机会运行!
我们可以采用以下方式在web.config中注册一个自定义的处理器:
  1. <httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>
复制代码
或者:(为了排版,我将一些代码做了换行处理)
  1. <httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers><httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers><httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers><httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>
复制代码
HttpModule

前面我已经提到过HttpModule的工作方式:订阅管线事件,并在事件处理器中执行所需的相关操作。
这个描述看起来很平淡,但是,它的工作方式给了它无限强大的处理能力。
它的无限强大的处理能力来源于可以订阅管线事件,因此,它有能力可以在许多阶段修改请求,这些修改最终可能会影响请求的处理。
前面我说过:“HttpHandler是处理请求的主要对象”,但HttpModule却可以随意指定将某个请求交给某个处理器来执行!
甚至,HttpModule也可以直接处理请求,完全不给HttpHandler工作的机会!
我们来看一下HttpModule的实现方式:
  1. /// /// 能支持双向GZIP压缩的Module,它会根据客户端是否启用GZIP来自动处理。/// 对于服务来说,不用关心GZIP处理,服务只要处理输入输出就可以了。/// internal class DuplexGzipModule : IHttpModule{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>public void Init(HttpApplication app)<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>{<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers><httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>app.BeginRequest += new EventHandler(app_BeginRequest);<httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>}<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers>void app_BeginRequest(object sender, EventArgs e)<httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>{<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers><httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>HttpApplication app = (HttpApplication)sender;<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers><httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers>// 注意:这里不能使用"Accept-Encoding"这个头,二者的意义完全不同。<httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers><httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers>if( app.Request.Headers["Content-Encoding"] == "gzip" ) {<httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers><httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>app.Request.Filter = new GZipStream(app.Request.Filter, CompressionMode.Decompress);<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers><httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers><httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers>app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);<httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers><httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers><httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers>app.Response.AppendHeader("Content-Encoding", "gzip");<httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers><httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers>}<httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers>}<httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers>public void Dispose()<httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers>{<httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers>}}
复制代码
每个HttpModule只需要实现IHttpModule接口就可以了。IHttpModule也是个简单的接口:
  1. public interface IHttpModule{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>void Dispose();<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>void Init(HttpApplication app);}
复制代码
在这二个方法中,第一个方法通常可以保持为空。最重要的方法就是Init,它给了HttpModule能订阅管线事件的机会,然后在相应的事件处理中,我们就可以执行它的具体操作了。
还记得我在博客【我心目中的Asp.net核心对象】最后给出一个示例吗?在QueryOrderService.ashx中,为了支持gzip,需要直接调用GZipStream类,对于一二个ashx来说,或许不是问题,如果这样的处理器变多了,每个处理器都那样写,您能受得了吗?反正我是受不了的,因此今天我把它改成使用Module来实现,代码简单了许多。在本文末尾可以下载。
对于Asp.net项目来说:当您发现有很多处理输入输出的操作非常类似时,那正是HttpModule可以发挥的舞台,请把这些重复的操作交给它吧。
让HttpModule工作也需要在web.config中注册:
  1. <httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>
复制代码
通常,我会把一些HttpModule放在类库中实现,然后在需要使用的项目的web.config中注册。
这也体现它的高重用性:写一次,许多项目就可以直接使用。
HttpModule的加载方式:前面我说过“Asp.net会为每个请求分配一个HttpApplication对象”,在每个HttpApplication对象的初始化操作中,它会加载所有在web.config中注册的HttpModule。由于Asp.net并不是只创建一个HttpApplication对象,而是多个HttpApplication对象,因此每个HttpModule的Init事件是有可能被多次调用的。许多人喜欢在这里做各类初始化的操作,那么请注意在这里修改静态变量成员时的线程安全问题。特别地,如果要执行程序初始化的操作,那么还是把代码放在Global.asax的Application_Start中去处理吧,HttpModule的Init事件并不合适。
为HttpModule选择订阅合适的管线事件:这是非常重要的,订阅不同的事件,产生的结果也会不一样。原因也很简单,在Asp.net运行环境中,并不只有一个HttpModule,某个HttpModule的判断可能要依据其它HttpModule的输出结果,而且在某些(晚期的)管线事件中,也不能再修改输出数据。在后面的示例中,DirectProcessRequestMoudle订阅了PostAuthorizeRequest事件,如果订阅BeginRequest事件或许将得到更好的性能,但是,在BeginRequest事件中,身份认证模块还没有工作,因此每个请求在这个事件阶段都属于“未登录”状态。
前面说了一大堆的HttpModule,事实上,在这个示例中,主角是另一个对象:Filter 。上篇博客我就提过它,最后为了演示它,把它放在一个HttpHandler里【糟蹋了】,没办法,上篇的主题不是管线呀。今天只好和HttpModule一起出场了。我认为Filter还是应该和HttpModule一起使用才能发挥它的独特价值。Filter的特点还真不合适在HttpHandler中使用,如果您在HttpHandler里使用Filter,我认为有必要考虑一下是不是用错了。
借HttpModule的地盘我们来谈谈Filter。Filter很低调,低调到什么程度:可能很少有人关注过它,因此也少有人用过它。事实也确实如此,一般情况下可以不用它,但用到它,你会发现它非常强大。前面我经常说到【输入输出流】,请求的数据,除了请求头以外,基本上全放在流中,如果您希望对这些数据以流的方式进行处理,特别是希望对于所有请求,或者某类请求,那么使用Filter是非常恰当的。前面的示例就是一个非常合理地使用,好好地品味它,或许您还能发现Filter能做更多的事情。
关于Content-Encoding的解释

2012年2月1日补充内容:
很多人在看了前面那段示例代码,都有一个疑问:Fish Li,你是不是搞错了,Content-Encoding并不是个请求头啊?
对于这个疑问,有人在博客园中给我发过消息,也有给我发邮件。在一次次地解释后,我还是打算在这里说说我选这个标头的理由。
首先,我要说的是:我也知道 Content-Encoding 不是一个【标准】的请求头。
对于浏览器来说,也没必要有这个头,因为浏览器在发送请求时,总是不压缩的。因此在HTTP的标准中没有为请求头定义一个表示请求体已编码过的标头。但是,如果因为HTTP标准没有定义这个头,我就应该不去实现这个功能吗??
要知道并非只有浏览器才能发送HTTP请求,我用C#写点代码也可以发送HTTP请求啊!
你说我要不要实现这个压缩请求体的功能??

我们自己去实现发送HTTP请求的客户端时,为了能让服务端知道:请求体的内容是压缩过的,是不是必须有个头去告诉服务端?然而,Accept-Encoding只是告诉服务端:客户端能接受什么样的编码,并不能表示某次请求体的内容是压缩过的,你说有什么好的办法??

所以,我就在请求头中就使用了Content-Encoding。事实上,我就算用"XXXXXXXXXXXX"表示请求体是压缩过的,也可以的,只要我在服务端去检测这个头就可以了。但为了自己容易理解,我宁可选择这个标头。
选 HttpHandler 还是 HttpModule ?

HttpHandler是每个请求的主要处理对象,而HttpModule可以选择请求交给哪个HttpHandler来处理,甚至,它还可以选择它自己来处理请求。
下面我给个示例代码来说明HttpModule也能直接请求:
  1. /// /// 此Module示范了直接使用Module也能处理客户端的请求。/// 建议:除非要很好的理由,否则不建议使用这种方法。/// internal class DirectProcessRequestMoudle : IHttpModule{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>public void Init(HttpApplication app)<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>{<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers><httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>app.PostAuthorizeRequest += new EventHandler(app_PostAuthorizeRequest);<httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>}<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers>void app_PostAuthorizeRequest(object sender, EventArgs e)<httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>{<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers><httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>HttpApplication app = (HttpApplication)sender;<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers><httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers>ServiceInfo info = GetServiceInfo(app.Context);<httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers><httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers>if( info == null )<httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers><httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>return;<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers><httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers>ServiceExecutor.ProcessRequest(app.Context, info);<httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers>app.Response.End();<httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers>}
复制代码
为了更好的回答本节的这个问题,我再给段等效的代码,不过,请求是经过HttpHandler来处理
  1. internal class MyServiceHandler : IHttpHandler{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>internal ServiceInfo ServiceInfo { get; set; }<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>public void ProcessRequest(HttpContext context)<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>{<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers><httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>ServiceInfo info = this.ServiceInfo ?? GetServiceInfo(context);<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers><httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>ServiceExecutor.ProcessRequest(context, info);<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers>}
复制代码
HttpHandler和HttpModule都能处理请求,我该选哪个??
对于此类情况,我的答案是:视情况而定,正如我在注释中描述的那样,除非要很好的理由,否则不建议使用HttpModule处理请求。用HttpModule在某些时候可能会快点,关键点在于处理完成时要调用Response.End();这会让后面的事件全都短路,其它的HttpModule就没有机会执行。如果您的框架或者项目设计很依赖于管线中的事件处理,那么调用Response.End();无疑会破坏这个规则,也将会导致不能得到正确的结果。选择HttpHandler就不会有这种事情发生。
不过,也没有绝对的事情:在请求处理期间,您可以在任何地方调用Response.End();  结果也是一样的。
幸好,短路的情况并不经常发生,因此选择HttpHandler会让整个Asp.net的管线都能发挥作用,因此,我建议优先选择HttpHandler。
尤其是在HttpHandler能很好的完成工作的前提下,就应该选HttpHandler,因为选HttpModule会给其它请求带来不必要的性能损失,具体细节请继续阅读。
其实,我们还可以从另一个角度来看这个问题。
首先,请仔细地阅读前面的示例代码,您是否发现它们在实现方式上非常类似?
现在应该找到答案了吧:把具体的处理操作分离到HttpHandler,HttpModule之外的地方。那么,此时这个问题也就不是问题了,您也可以提供多种方案供使用者选择。比如:我就为【我的服务框架】提供了5种方式让使用者可以轻松地将一个C#方法公开为一个服务方法,该如何选择这个问题,由使用者来决定,这个问题不会让我为难。
我的观点:在没有太多技术难度的前提下,提供多种解决办法应该是对的,您将会避开很多麻烦事情。
看不见的性能问题

前面我介绍了HttpModule的重要优点:高重用性。只要写好一个HttpModule可以放在任何Asp.net项目中使用,非常方便。
不过,再好的东西也不能滥用。HttpModule也可以对性能产生负面影响。原因也很简单:对于每个Asp.net请求,每个HttpModule都会在它们所订阅的事件中,去执行一些操作逻辑。这些操作逻辑或许对一些请求是无意义的,但仍会执行。因此,计算机将会白白浪费一些资源去执行一些无意义的代码。
知道了原因,解决办法也就很清楚了:
1. 去掉不需要的HttpModule
2. 在每个HttpModule的事件处理器中,首先要确定是不是自己所需要处理的请求。对一些不相关的请求,应该立即退出。
在我们创建一个Asp.net项目时,如果不做任何修改,微软已经为我们加载了好多HttpModule 。请看以下代码:
  1. protected void Page_Load(object sender, EventArgs e){<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>HttpApplication app = HttpContext.Current.ApplicationInstance;<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers><httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers><httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>StringBuilder sb = new StringBuilder();<httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>foreach( string module in app.Modules.AllKeys )<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers><httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers> sb.AppendFormat(module).Append("
  72. ");<httpHandlers>
  73. <httpModules>
  74. <httpModules>
  75. <httpModules>
  76. <httpHandlers>
  77.    
  78. </httpHandlers>
  79. </httpModules>
  80. </httpModules>
  81. </httpModules>
  82. </httpHandlers>Response.Write(sb.ToString());}
复制代码
输出结果如下:
3.gif

总共有14个。
哎,大多数是我肯定不会用到的,但它们却被加载了,因此,在它们所订阅的事件中,它们的代码将会检查所有的请求,那些无意义的代码将有机会执行。如果您不想视而不见,那么请在web.config中做类似的修改,将不需要的Module移除。
  1. <httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers><httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>
复制代码
HttpModule的第2个需要注意的地方是:HttpModule对所有的请求有效,如果HttpModule不能处理所有的请求,那么请先判断当前请求是否需要处理,对于不需要处理的请求,应该立即退出。请看以下示例代码:
  1. /// /// 【演示用】让Aspx页的请求支持gzip压缩输出/// public class FishGzipModule : IHttpModule{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>public void Init(HttpApplication app)<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>{<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers><httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>app.BeginRequest += new EventHandler(app_BeginRequest);<httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>}<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers>void app_BeginRequest(object sender, EventArgs e)<httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>{<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers><httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>HttpApplication app = (HttpApplication)sender;<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers><httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers>// 这里做个简单的演示,只处理aspx页面的输出压缩。<httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers><httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers>// 当然了,IIS也提供压缩功能,这里也仅当演示用,或许可适用于一些特殊场合。<httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers><httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers>if( app.Request.AppRelativeCurrentExecutionFilePath.EndsWith(<httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers><httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers><httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers><httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers><httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers><httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers>"aspx", StringComparison.OrdinalIgnoreCase) == false )<httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers><httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers><httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers>// 注意:先判断是不是要处理的请求,如果不是,直接退出。<httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers><httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers><httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers>//<httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers><httpHandlers>
  292. <httpModules>
  293. <httpModules>
  294. <httpModules>
  295. <httpHandlers>
  296.    
  297. </httpHandlers>
  298. </httpModules>
  299. </httpModules>
  300. </httpModules>
  301. </httpHandlers>而不是:先执行了后面的判断,再发现不是aspx时才退出。<httpHandlers>
  302. <httpModules>
  303. <httpModules>
  304. <httpModules>
  305. <httpHandlers>
  306.    
  307. </httpHandlers>
  308. </httpModules>
  309. </httpModules>
  310. </httpModules>
  311. </httpHandlers><httpHandlers>
  312. <httpModules>
  313. <httpModules>
  314. <httpModules>
  315. <httpHandlers>
  316.    
  317. </httpHandlers>
  318. </httpModules>
  319. </httpModules>
  320. </httpModules>
  321. </httpHandlers><httpHandlers>
  322. <httpModules>
  323. <httpModules>
  324. <httpModules>
  325. <httpHandlers>
  326.    
  327. </httpHandlers>
  328. </httpModules>
  329. </httpModules>
  330. </httpModules>
  331. </httpHandlers>return;<httpHandlers>
  332. <httpModules>
  333. <httpModules>
  334. <httpModules>
  335. <httpHandlers>
  336.    
  337. </httpHandlers>
  338. </httpModules>
  339. </httpModules>
  340. </httpModules>
  341. </httpHandlers><httpHandlers>
  342. <httpModules>
  343. <httpModules>
  344. <httpModules>
  345. <httpHandlers>
  346.    
  347. </httpHandlers>
  348. </httpModules>
  349. </httpModules>
  350. </httpModules>
  351. </httpHandlers>string flag = app.Request.Headers["Accept-Encoding"];<httpHandlers>
  352. <httpModules>
  353. <httpModules>
  354. <httpModules>
  355. <httpHandlers>
  356.    
  357. </httpHandlers>
  358. </httpModules>
  359. </httpModules>
  360. </httpModules>
  361. </httpHandlers><httpHandlers>
  362. <httpModules>
  363. <httpModules>
  364. <httpModules>
  365. <httpHandlers>
  366.    
  367. </httpHandlers>
  368. </httpModules>
  369. </httpModules>
  370. </httpModules>
  371. </httpHandlers>if( string.IsNullOrEmpty(flag) == false && flag.ToLower().IndexOf("gzip") >= 0 ) {<httpHandlers>
  372. <httpModules>
  373. <httpModules>
  374. <httpModules>
  375. <httpHandlers>
  376.    
  377. </httpHandlers>
  378. </httpModules>
  379. </httpModules>
  380. </httpModules>
  381. </httpHandlers><httpHandlers>
  382. <httpModules>
  383. <httpModules>
  384. <httpModules>
  385. <httpHandlers>
  386.    
  387. </httpHandlers>
  388. </httpModules>
  389. </httpModules>
  390. </httpModules>
  391. </httpHandlers><httpHandlers>
  392. <httpModules>
  393. <httpModules>
  394. <httpModules>
  395. <httpHandlers>
  396.    
  397. </httpHandlers>
  398. </httpModules>
  399. </httpModules>
  400. </httpModules>
  401. </httpHandlers>app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress);<httpHandlers>
  402. <httpModules>
  403. <httpModules>
  404. <httpModules>
  405. <httpHandlers>
  406.    
  407. </httpHandlers>
  408. </httpModules>
  409. </httpModules>
  410. </httpModules>
  411. </httpHandlers><httpHandlers>
  412. <httpModules>
  413. <httpModules>
  414. <httpModules>
  415. <httpHandlers>
  416.    
  417. </httpHandlers>
  418. </httpModules>
  419. </httpModules>
  420. </httpModules>
  421. </httpHandlers><httpHandlers>
  422. <httpModules>
  423. <httpModules>
  424. <httpModules>
  425. <httpHandlers>
  426.    
  427. </httpHandlers>
  428. </httpModules>
  429. </httpModules>
  430. </httpModules>
  431. </httpHandlers>app.Response.AppendHeader("Content-Encoding", "gzip");<httpHandlers>
  432. <httpModules>
  433. <httpModules>
  434. <httpModules>
  435. <httpHandlers>
  436.    
  437. </httpHandlers>
  438. </httpModules>
  439. </httpModules>
  440. </httpModules>
  441. </httpHandlers><httpHandlers>
  442. <httpModules>
  443. <httpModules>
  444. <httpModules>
  445. <httpHandlers>
  446.    
  447. </httpHandlers>
  448. </httpModules>
  449. </httpModules>
  450. </httpModules>
  451. </httpHandlers>}<httpHandlers>
  452. <httpModules>
  453. <httpModules>
  454. <httpModules>
  455. <httpHandlers>
  456.    
  457. </httpHandlers>
  458. </httpModules>
  459. </httpModules>
  460. </httpModules>
  461. </httpHandlers>}
复制代码
更多实战介绍

本文从这里起,将不再过多的叙述一些理论文字,而是将以实战的形式展示Asp.net的强大管线功能,这些实战展示了一些很经典的应用场景,其中大部分示例代码将做为【我的服务框架】的关键部分。因此请注意理解这些代码。
实战代码大量使用了上篇博客【我心目中的Asp.net核心对象】所介绍的绝大多数对象,也算是再次展示那些核心对象的重要性,因此请务必先了解那些核心对象。
上篇博客仅展示了那些强大对象的功能,单独使用它们,也是不现实的,今天,我将演示它们与HttpHandler, HttpModule一起并肩工作所能完成的各种任务。
故事未讲完,传奇在继续。更多精彩即将上演!

实战演示 - 模拟更多的HttpMethod

近几年又有一种被称为RESTful Web服务的概念进入开发人员的视野,它提倡使用HTTP协议提供的GET、POST、PUT和DELETE方法来操作网络资源。不过,目前的浏览器只支持GET、POST这二种方法,因此就有人想到采用HTTP头,表单值,或者查询字符串的形式来模拟这些浏览器不支持的HTTP方法。每种支持RESTful Web服务的框架都有它们自己的实现方式,今天我将使用HttpModule也来模拟这个操作。最终的结果是可以直接访问HttpRequest.HttpMethod获取这些操作的方法名字。
实现原理:订阅管线中的BeginRequest事件,检查当前请求是否需要修改HttpMethod,如果是,则修改HttpMethod属性。
所以选择BeginRequest这个事件,是因为这个事件比较早,可以让请求的后续阶段都能读到新的结果。
  1. /// /// 【演示用】实现了模拟更多 HttpMethod 的Module/// internal class XHttpMethodModule : IHttpModule{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>private FieldInfo _field;<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>public void Init(HttpApplication context)<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>{<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers><httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>// 订阅这个较早的事件,可以让请求的后续阶段都能读到新的结果。<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers><httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>context.BeginRequest += new EventHandler(context_BeginRequest);<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers><httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>_field = typeof(HttpRequest).GetField("_httpMethod", BindingFlags.Instance | BindingFlags.NonPublic);<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers>}<httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers>void context_BeginRequest(object sender, EventArgs e)<httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers>{<httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers><httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers>HttpApplication app = (HttpApplication)sender;<httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>// 这里仅检查是否为POST操作,如果您的应用中需要使用GET来模拟的,请修改这里。<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers><httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers>if( string.Equals(app.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase) ) {<httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers><httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers>// 这里为了简单,我只检查请求头,如果还需要检查表单值或者查询字符串,请修改这里。<httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers><httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers><httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers>string headerOverrideValue = app.Request.Headers["X-HTTP-Method-Override"];<httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers><httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers><httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers>if( string.IsNullOrEmpty(headerOverrideValue) == false ) {<httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers><httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers><httpHandlers>
  292. <httpModules>
  293. <httpModules>
  294. <httpModules>
  295. <httpHandlers>
  296.    
  297. </httpHandlers>
  298. </httpModules>
  299. </httpModules>
  300. </httpModules>
  301. </httpHandlers><httpHandlers>
  302. <httpModules>
  303. <httpModules>
  304. <httpModules>
  305. <httpHandlers>
  306.    
  307. </httpHandlers>
  308. </httpModules>
  309. </httpModules>
  310. </httpModules>
  311. </httpHandlers>if( string.Equals(headerOverrideValue, "GET", StringComparison.OrdinalIgnoreCase) == false &&<httpHandlers>
  312. <httpModules>
  313. <httpModules>
  314. <httpModules>
  315. <httpHandlers>
  316.    
  317. </httpHandlers>
  318. </httpModules>
  319. </httpModules>
  320. </httpModules>
  321. </httpHandlers><httpHandlers>
  322. <httpModules>
  323. <httpModules>
  324. <httpModules>
  325. <httpHandlers>
  326.    
  327. </httpHandlers>
  328. </httpModules>
  329. </httpModules>
  330. </httpModules>
  331. </httpHandlers><httpHandlers>
  332. <httpModules>
  333. <httpModules>
  334. <httpModules>
  335. <httpHandlers>
  336.    
  337. </httpHandlers>
  338. </httpModules>
  339. </httpModules>
  340. </httpModules>
  341. </httpHandlers><httpHandlers>
  342. <httpModules>
  343. <httpModules>
  344. <httpModules>
  345. <httpHandlers>
  346.    
  347. </httpHandlers>
  348. </httpModules>
  349. </httpModules>
  350. </httpModules>
  351. </httpHandlers><httpHandlers>
  352. <httpModules>
  353. <httpModules>
  354. <httpModules>
  355. <httpHandlers>
  356.    
  357. </httpHandlers>
  358. </httpModules>
  359. </httpModules>
  360. </httpModules>
  361. </httpHandlers>string.Equals(headerOverrideValue, "POST", StringComparison.OrdinalIgnoreCase) == false ) {<httpHandlers>
  362. <httpModules>
  363. <httpModules>
  364. <httpModules>
  365. <httpHandlers>
  366.    
  367. </httpHandlers>
  368. </httpModules>
  369. </httpModules>
  370. </httpModules>
  371. </httpHandlers><httpHandlers>
  372. <httpModules>
  373. <httpModules>
  374. <httpModules>
  375. <httpHandlers>
  376.    
  377. </httpHandlers>
  378. </httpModules>
  379. </httpModules>
  380. </httpModules>
  381. </httpHandlers><httpHandlers>
  382. <httpModules>
  383. <httpModules>
  384. <httpModules>
  385. <httpHandlers>
  386.    
  387. </httpHandlers>
  388. </httpModules>
  389. </httpModules>
  390. </httpModules>
  391. </httpHandlers><httpHandlers>
  392. <httpModules>
  393. <httpModules>
  394. <httpModules>
  395. <httpHandlers>
  396.    
  397. </httpHandlers>
  398. </httpModules>
  399. </httpModules>
  400. </httpModules>
  401. </httpHandlers><httpHandlers>
  402. <httpModules>
  403. <httpModules>
  404. <httpModules>
  405. <httpHandlers>
  406.    
  407. </httpHandlers>
  408. </httpModules>
  409. </httpModules>
  410. </httpModules>
  411. </httpHandlers>// HttpRequest.HttpMethod属性其实就是访问_httpMethod这个私有字段,我将直接修改它。<httpHandlers>
  412. <httpModules>
  413. <httpModules>
  414. <httpModules>
  415. <httpHandlers>
  416.    
  417. </httpHandlers>
  418. </httpModules>
  419. </httpModules>
  420. </httpModules>
  421. </httpHandlers><httpHandlers>
  422. <httpModules>
  423. <httpModules>
  424. <httpModules>
  425. <httpHandlers>
  426.    
  427. </httpHandlers>
  428. </httpModules>
  429. </httpModules>
  430. </httpModules>
  431. </httpHandlers><httpHandlers>
  432. <httpModules>
  433. <httpModules>
  434. <httpModules>
  435. <httpHandlers>
  436.    
  437. </httpHandlers>
  438. </httpModules>
  439. </httpModules>
  440. </httpModules>
  441. </httpHandlers><httpHandlers>
  442. <httpModules>
  443. <httpModules>
  444. <httpModules>
  445. <httpHandlers>
  446.    
  447. </httpHandlers>
  448. </httpModules>
  449. </httpModules>
  450. </httpModules>
  451. </httpHandlers><httpHandlers>
  452. <httpModules>
  453. <httpModules>
  454. <httpModules>
  455. <httpHandlers>
  456.    
  457. </httpHandlers>
  458. </httpModules>
  459. </httpModules>
  460. </httpModules>
  461. </httpHandlers>// 这样修改后,最原始的HTTP方法就丢失,通常这或许也是可以接受的。<httpHandlers>
  462. <httpModules>
  463. <httpModules>
  464. <httpModules>
  465. <httpHandlers>
  466.    
  467. </httpHandlers>
  468. </httpModules>
  469. </httpModules>
  470. </httpModules>
  471. </httpHandlers><httpHandlers>
  472. <httpModules>
  473. <httpModules>
  474. <httpModules>
  475. <httpHandlers>
  476.    
  477. </httpHandlers>
  478. </httpModules>
  479. </httpModules>
  480. </httpModules>
  481. </httpHandlers><httpHandlers>
  482. <httpModules>
  483. <httpModules>
  484. <httpModules>
  485. <httpHandlers>
  486.    
  487. </httpHandlers>
  488. </httpModules>
  489. </httpModules>
  490. </httpModules>
  491. </httpHandlers><httpHandlers>
  492. <httpModules>
  493. <httpModules>
  494. <httpModules>
  495. <httpHandlers>
  496.    
  497. </httpHandlers>
  498. </httpModules>
  499. </httpModules>
  500. </httpModules>
  501. </httpHandlers><httpHandlers>
  502. <httpModules>
  503. <httpModules>
  504. <httpModules>
  505. <httpHandlers>
  506.    
  507. </httpHandlers>
  508. </httpModules>
  509. </httpModules>
  510. </httpModules>
  511. </httpHandlers>_field.SetValue(app.Request, headerOverrideValue.ToUpper());<httpHandlers>
  512. <httpModules>
  513. <httpModules>
  514. <httpModules>
  515. <httpHandlers>
  516.    
  517. </httpHandlers>
  518. </httpModules>
  519. </httpModules>
  520. </httpModules>
  521. </httpHandlers><httpHandlers>
  522. <httpModules>
  523. <httpModules>
  524. <httpModules>
  525. <httpHandlers>
  526.    
  527. </httpHandlers>
  528. </httpModules>
  529. </httpModules>
  530. </httpModules>
  531. </httpHandlers><httpHandlers>
  532. <httpModules>
  533. <httpModules>
  534. <httpModules>
  535. <httpHandlers>
  536.    
  537. </httpHandlers>
  538. </httpModules>
  539. </httpModules>
  540. </httpModules>
  541. </httpHandlers><httpHandlers>
  542. <httpModules>
  543. <httpModules>
  544. <httpModules>
  545. <httpHandlers>
  546.    
  547. </httpHandlers>
  548. </httpModules>
  549. </httpModules>
  550. </httpModules>
  551. </httpHandlers>}<httpHandlers>
  552. <httpModules>
  553. <httpModules>
  554. <httpModules>
  555. <httpHandlers>
  556.    
  557. </httpHandlers>
  558. </httpModules>
  559. </httpModules>
  560. </httpModules>
  561. </httpHandlers><httpHandlers>
  562. <httpModules>
  563. <httpModules>
  564. <httpModules>
  565. <httpHandlers>
  566.    
  567. </httpHandlers>
  568. </httpModules>
  569. </httpModules>
  570. </httpModules>
  571. </httpHandlers><httpHandlers>
  572. <httpModules>
  573. <httpModules>
  574. <httpModules>
  575. <httpHandlers>
  576.    
  577. </httpHandlers>
  578. </httpModules>
  579. </httpModules>
  580. </httpModules>
  581. </httpHandlers>}<httpHandlers>
  582. <httpModules>
  583. <httpModules>
  584. <httpModules>
  585. <httpHandlers>
  586.    
  587. </httpHandlers>
  588. </httpModules>
  589. </httpModules>
  590. </httpModules>
  591. </httpHandlers><httpHandlers>
  592. <httpModules>
  593. <httpModules>
  594. <httpModules>
  595. <httpHandlers>
  596.    
  597. </httpHandlers>
  598. </httpModules>
  599. </httpModules>
  600. </httpModules>
  601. </httpHandlers>}<httpHandlers>
  602. <httpModules>
  603. <httpModules>
  604. <httpModules>
  605. <httpHandlers>
  606.    
  607. </httpHandlers>
  608. </httpModules>
  609. </httpModules>
  610. </httpModules>
  611. </httpHandlers>}
复制代码
我认为采用HttpModule来处理这个问题是个不错的选择。它至少有2个好处:
1. 这个HttpModule能继续给其它的网站项目使用,因此提高了代码的重用性。
2. 我可以随时决定要不要支持模拟,不需要模拟时,从web.config中不加载它就可以了,因此切换很灵活,且不需要修改现有代码。
来看一下页面及调用结果吧
  1. protected void Page_Load(object sender, EventArgs e){<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>Response.Write(Request.HttpMethod);}
复制代码
4.gif

调用结果如下:
5.gif

实战演示 - URL重写

使用HttpModule来实现URL重写。这个功能应该是HttpModule非常经典的应用了。
通常情况下,这种应用常用的方式是将一个URL: /product/12 重写为 /product.aspx?id=12 ,此时product.aspx应该是一个已经已存在的页面。显然重写后的地址更友好。URL重写的目的就是能让URL更友好。
实现原理:订阅管线的PostAuthorizeRequest事件,检查URL是不是期望修改的模式,如果是,则调用Context.RewritePath()完成URL的重写操作。在管线的后续处理中,最终会使用新的URL来映射到一个合适的HttpHandler。说明:选择的事件只要在【第10个事件】之前就可以了,因为在第10个事件前重写URL,才能保证到将请求映射到合适的处理器来执行。就这么简单,请参考以下代码:
  1. public class MyServiceUrlRewriteModule : IHttpModule{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>// 为了演示简单,直接写死地址。<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>// 注意:MyService.axd 必须在web.config中注册,以保证它能成功映射。<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>public static string RewriteUrlPattern = "/MyService.axd?sc={1}&op={1}";<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>public void Init(HttpApplication app)<httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>{<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers><httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>app.PostAuthorizeRequest += new EventHandler(app_PostAuthorizeRequest);<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers>}<httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>void app_PostAuthorizeRequest(object sender, EventArgs e)<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers>{<httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers><httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers>HttpApplication app = (HttpApplication)sender;<httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers><httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers>// 这里将检查URL是否为需要重写的模式,比如:<httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>//   http://localhost:11647/service/OrderService/QueryOrder<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers><httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers>NamesPair pair = FrameworkRules.ParseNamesPair(app.Request);<httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers>if( pair == null )<httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers><httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers><httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers>return;<httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers><httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers>// 开始重写URL,最后将会映射到MyServiceHandler<httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers><httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers>int p = app.Request.Path.IndexOf('?');<httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers><httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers>if( p > 0 )<httpHandlers>
  292. <httpModules>
  293. <httpModules>
  294. <httpModules>
  295. <httpHandlers>
  296.    
  297. </httpHandlers>
  298. </httpModules>
  299. </httpModules>
  300. </httpModules>
  301. </httpHandlers><httpHandlers>
  302. <httpModules>
  303. <httpModules>
  304. <httpModules>
  305. <httpHandlers>
  306.    
  307. </httpHandlers>
  308. </httpModules>
  309. </httpModules>
  310. </httpModules>
  311. </httpHandlers><httpHandlers>
  312. <httpModules>
  313. <httpModules>
  314. <httpModules>
  315. <httpHandlers>
  316.    
  317. </httpHandlers>
  318. </httpModules>
  319. </httpModules>
  320. </httpModules>
  321. </httpHandlers>app.Context.RewritePath(string.Format(RewriteUrlPattern, pair.ServiceName, pair.MethodName)<httpHandlers>
  322. <httpModules>
  323. <httpModules>
  324. <httpModules>
  325. <httpHandlers>
  326.    
  327. </httpHandlers>
  328. </httpModules>
  329. </httpModules>
  330. </httpModules>
  331. </httpHandlers><httpHandlers>
  332. <httpModules>
  333. <httpModules>
  334. <httpModules>
  335. <httpHandlers>
  336.    
  337. </httpHandlers>
  338. </httpModules>
  339. </httpModules>
  340. </httpModules>
  341. </httpHandlers><httpHandlers>
  342. <httpModules>
  343. <httpModules>
  344. <httpModules>
  345. <httpHandlers>
  346.    
  347. </httpHandlers>
  348. </httpModules>
  349. </httpModules>
  350. </httpModules>
  351. </httpHandlers><httpHandlers>
  352. <httpModules>
  353. <httpModules>
  354. <httpModules>
  355. <httpHandlers>
  356.    
  357. </httpHandlers>
  358. </httpModules>
  359. </httpModules>
  360. </httpModules>
  361. </httpHandlers>+ "&" + app.Request.Path.Substring(p + 1)<httpHandlers>
  362. <httpModules>
  363. <httpModules>
  364. <httpModules>
  365. <httpHandlers>
  366.    
  367. </httpHandlers>
  368. </httpModules>
  369. </httpModules>
  370. </httpModules>
  371. </httpHandlers><httpHandlers>
  372. <httpModules>
  373. <httpModules>
  374. <httpModules>
  375. <httpHandlers>
  376.    
  377. </httpHandlers>
  378. </httpModules>
  379. </httpModules>
  380. </httpModules>
  381. </httpHandlers><httpHandlers>
  382. <httpModules>
  383. <httpModules>
  384. <httpModules>
  385. <httpHandlers>
  386.    
  387. </httpHandlers>
  388. </httpModules>
  389. </httpModules>
  390. </httpModules>
  391. </httpHandlers><httpHandlers>
  392. <httpModules>
  393. <httpModules>
  394. <httpModules>
  395. <httpHandlers>
  396.    
  397. </httpHandlers>
  398. </httpModules>
  399. </httpModules>
  400. </httpModules>
  401. </httpHandlers>);<httpHandlers>
  402. <httpModules>
  403. <httpModules>
  404. <httpModules>
  405. <httpHandlers>
  406.    
  407. </httpHandlers>
  408. </httpModules>
  409. </httpModules>
  410. </httpModules>
  411. </httpHandlers><httpHandlers>
  412. <httpModules>
  413. <httpModules>
  414. <httpModules>
  415. <httpHandlers>
  416.    
  417. </httpHandlers>
  418. </httpModules>
  419. </httpModules>
  420. </httpModules>
  421. </httpHandlers>else<httpHandlers>
  422. <httpModules>
  423. <httpModules>
  424. <httpModules>
  425. <httpHandlers>
  426.    
  427. </httpHandlers>
  428. </httpModules>
  429. </httpModules>
  430. </httpModules>
  431. </httpHandlers><httpHandlers>
  432. <httpModules>
  433. <httpModules>
  434. <httpModules>
  435. <httpHandlers>
  436.    
  437. </httpHandlers>
  438. </httpModules>
  439. </httpModules>
  440. </httpModules>
  441. </httpHandlers><httpHandlers>
  442. <httpModules>
  443. <httpModules>
  444. <httpModules>
  445. <httpHandlers>
  446.    
  447. </httpHandlers>
  448. </httpModules>
  449. </httpModules>
  450. </httpModules>
  451. </httpHandlers>app.Context.RewritePath(string.Format(RewriteUrlPattern, pair.ServiceName, pair.MethodName));<httpHandlers>
  452. <httpModules>
  453. <httpModules>
  454. <httpModules>
  455. <httpHandlers>
  456.    
  457. </httpHandlers>
  458. </httpModules>
  459. </httpModules>
  460. </httpModules>
  461. </httpHandlers>}
复制代码
重写发生了什么?
对于一个传入请求:http://localhost:11647/service/FormDemoService/ShowUrlInfo
它将被重写为:http://localhost:11647/MyService.axd?sc=FormDemoService&op=ShowUrlInfo
由于在web.config中,对MyService.axd已做过注册,因此Asp.net会将请求转交给注册的处理器来处理它。
注意:URL重写,会影响某些变量的值。请参考以下代码,我将写个服务方法来检测这个现象:
  1. [MyServiceMethod]public string ShowUrlInfo(int a){<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>System.Web.HttpRequest request = System.Web.HttpContext.Current.Request;<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>System.Text.StringBuilder sb = new System.Text.StringBuilder();<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>sb.AppendFormat("Path: {0}\r\n", request.Path);<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers><httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers><httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers><httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>sb.AppendFormat("RawUrl: {0}\r\n", request.RawUrl);<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers>sb.AppendFormat("Url.PathAndQuery: {0}\r\n", request.Url.PathAndQuery);<httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>return sb.ToString();}
复制代码
输出结果:
6.gif

实战演示 - URL路由

使用HttpModule来实现URL路由。这个功能随着Asp.net MVC框架的出现也逐渐流行起来了。
URL路由的目标也是为了使用URL更友好,与URL重写类似。
实现原理:订阅管线的PostResolveRequestCache事件,检查URL是不是期望的路由模式,如果是,则要根据请求中所包含的信息找到一个合适的处理器,并临时保存这个处理器,重写URL到一个Asp.net能映射处理器的地址。在管线的PostMapRequestHandler中,检查前面有没有临时保存的处理器,如果有,则重新给Context.Handler赋值,并重写URL到原始地址。在管线的后续处理中,最终会使用Context.Handler的HttpHandler。就这么简单,请参考以下代码:
  1. public class MyServiceUrlRoutingModule : IHttpModule{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>private static readonly object s_dataKey = new object();<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>public void Init(HttpApplication app)<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>{<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers><httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>app.PostResolveRequestCache += new EventHandler(app_PostResolveRequestCache);<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers><httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>app.PostMapRequestHandler += new EventHandler(app_PostMapRequestHandler);<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers>}<httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>private void app_PostResolveRequestCache(object sender, EventArgs e)<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers>{<httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers><httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers>HttpApplication app = (HttpApplication)sender;<httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers><httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers>// 获取合适的处理器,注意这是与URL重写的根本差别。<httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>// 即:根据当前请求【主动】寻找一个处理器,而不是使用RewritePath让Asp.net替我们去找。<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers><httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers>MyServiceHandler handler = GetHandler(app.Context);<httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers>if( handler == null )<httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers><httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers><httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers>return;<httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers><httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers>// 临时保存前面获取到的处理器,这个值将在PostMapRequestHandler事件中再取出来。<httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers><httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers>app.Context.Items[s_dataKey] = handler;<httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers><httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers>// 进入正常的MapRequestHandler事件,随便映射到一个处理器就行了。<httpHandlers>
  292. <httpModules>
  293. <httpModules>
  294. <httpModules>
  295. <httpHandlers>
  296.    
  297. </httpHandlers>
  298. </httpModules>
  299. </httpModules>
  300. </httpModules>
  301. </httpHandlers><httpHandlers>
  302. <httpModules>
  303. <httpModules>
  304. <httpModules>
  305. <httpHandlers>
  306.    
  307. </httpHandlers>
  308. </httpModules>
  309. </httpModules>
  310. </httpModules>
  311. </httpHandlers>app.Context.RewritePath("~/MyServiceUrlRoutingModule.axd");<httpHandlers>
  312. <httpModules>
  313. <httpModules>
  314. <httpModules>
  315. <httpHandlers>
  316.    
  317. </httpHandlers>
  318. </httpModules>
  319. </httpModules>
  320. </httpModules>
  321. </httpHandlers>}<httpHandlers>
  322. <httpModules>
  323. <httpModules>
  324. <httpModules>
  325. <httpHandlers>
  326.    
  327. </httpHandlers>
  328. </httpModules>
  329. </httpModules>
  330. </httpModules>
  331. </httpHandlers>private void app_PostMapRequestHandler(object sender, EventArgs e)<httpHandlers>
  332. <httpModules>
  333. <httpModules>
  334. <httpModules>
  335. <httpHandlers>
  336.    
  337. </httpHandlers>
  338. </httpModules>
  339. </httpModules>
  340. </httpModules>
  341. </httpHandlers>{<httpHandlers>
  342. <httpModules>
  343. <httpModules>
  344. <httpModules>
  345. <httpHandlers>
  346.    
  347. </httpHandlers>
  348. </httpModules>
  349. </httpModules>
  350. </httpModules>
  351. </httpHandlers><httpHandlers>
  352. <httpModules>
  353. <httpModules>
  354. <httpModules>
  355. <httpHandlers>
  356.    
  357. </httpHandlers>
  358. </httpModules>
  359. </httpModules>
  360. </httpModules>
  361. </httpHandlers>HttpApplication app = (HttpApplication)sender;<httpHandlers>
  362. <httpModules>
  363. <httpModules>
  364. <httpModules>
  365. <httpHandlers>
  366.    
  367. </httpHandlers>
  368. </httpModules>
  369. </httpModules>
  370. </httpModules>
  371. </httpHandlers><httpHandlers>
  372. <httpModules>
  373. <httpModules>
  374. <httpModules>
  375. <httpHandlers>
  376.    
  377. </httpHandlers>
  378. </httpModules>
  379. </httpModules>
  380. </httpModules>
  381. </httpHandlers>// 取出在PostResolveRequestCache事件中获得的处理器<httpHandlers>
  382. <httpModules>
  383. <httpModules>
  384. <httpModules>
  385. <httpHandlers>
  386.    
  387. </httpHandlers>
  388. </httpModules>
  389. </httpModules>
  390. </httpModules>
  391. </httpHandlers><httpHandlers>
  392. <httpModules>
  393. <httpModules>
  394. <httpModules>
  395. <httpHandlers>
  396.    
  397. </httpHandlers>
  398. </httpModules>
  399. </httpModules>
  400. </httpModules>
  401. </httpHandlers>MyServiceHandler handler = (MyServiceHandler)app.Context.Items[s_dataKey];<httpHandlers>
  402. <httpModules>
  403. <httpModules>
  404. <httpModules>
  405. <httpHandlers>
  406.    
  407. </httpHandlers>
  408. </httpModules>
  409. </httpModules>
  410. </httpModules>
  411. </httpHandlers><httpHandlers>
  412. <httpModules>
  413. <httpModules>
  414. <httpModules>
  415. <httpHandlers>
  416.    
  417. </httpHandlers>
  418. </httpModules>
  419. </httpModules>
  420. </httpModules>
  421. </httpHandlers>if( handler != null ) {<httpHandlers>
  422. <httpModules>
  423. <httpModules>
  424. <httpModules>
  425. <httpHandlers>
  426.    
  427. </httpHandlers>
  428. </httpModules>
  429. </httpModules>
  430. </httpModules>
  431. </httpHandlers><httpHandlers>
  432. <httpModules>
  433. <httpModules>
  434. <httpModules>
  435. <httpHandlers>
  436.    
  437. </httpHandlers>
  438. </httpModules>
  439. </httpModules>
  440. </httpModules>
  441. </httpHandlers><httpHandlers>
  442. <httpModules>
  443. <httpModules>
  444. <httpModules>
  445. <httpHandlers>
  446.    
  447. </httpHandlers>
  448. </httpModules>
  449. </httpModules>
  450. </httpModules>
  451. </httpHandlers>// 还原URL请求地址。注意这里和URL重写的差别。<httpHandlers>
  452. <httpModules>
  453. <httpModules>
  454. <httpModules>
  455. <httpHandlers>
  456.    
  457. </httpHandlers>
  458. </httpModules>
  459. </httpModules>
  460. </httpModules>
  461. </httpHandlers><httpHandlers>
  462. <httpModules>
  463. <httpModules>
  464. <httpModules>
  465. <httpHandlers>
  466.    
  467. </httpHandlers>
  468. </httpModules>
  469. </httpModules>
  470. </httpModules>
  471. </httpHandlers><httpHandlers>
  472. <httpModules>
  473. <httpModules>
  474. <httpModules>
  475. <httpHandlers>
  476.    
  477. </httpHandlers>
  478. </httpModules>
  479. </httpModules>
  480. </httpModules>
  481. </httpHandlers>app.Context.RewritePath(app.Request.RawUrl);<httpHandlers>
  482. <httpModules>
  483. <httpModules>
  484. <httpModules>
  485. <httpHandlers>
  486.    
  487. </httpHandlers>
  488. </httpModules>
  489. </httpModules>
  490. </httpModules>
  491. </httpHandlers><httpHandlers>
  492. <httpModules>
  493. <httpModules>
  494. <httpModules>
  495. <httpHandlers>
  496.    
  497. </httpHandlers>
  498. </httpModules>
  499. </httpModules>
  500. </httpModules>
  501. </httpHandlers><httpHandlers>
  502. <httpModules>
  503. <httpModules>
  504. <httpModules>
  505. <httpHandlers>
  506.    
  507. </httpHandlers>
  508. </httpModules>
  509. </httpModules>
  510. </httpModules>
  511. </httpHandlers>// 还原根据GetHandler(app.Context)调用得到的处理器。<httpHandlers>
  512. <httpModules>
  513. <httpModules>
  514. <httpModules>
  515. <httpHandlers>
  516.    
  517. </httpHandlers>
  518. </httpModules>
  519. </httpModules>
  520. </httpModules>
  521. </httpHandlers><httpHandlers>
  522. <httpModules>
  523. <httpModules>
  524. <httpModules>
  525. <httpHandlers>
  526.    
  527. </httpHandlers>
  528. </httpModules>
  529. </httpModules>
  530. </httpModules>
  531. </httpHandlers><httpHandlers>
  532. <httpModules>
  533. <httpModules>
  534. <httpModules>
  535. <httpHandlers>
  536.    
  537. </httpHandlers>
  538. </httpModules>
  539. </httpModules>
  540. </httpModules>
  541. </httpHandlers>// 因为此时app.Context.Handler是由"~/MyServiceUrlRoutingModule.axd"映射得到的。<httpHandlers>
  542. <httpModules>
  543. <httpModules>
  544. <httpModules>
  545. <httpHandlers>
  546.    
  547. </httpHandlers>
  548. </httpModules>
  549. </httpModules>
  550. </httpModules>
  551. </httpHandlers><httpHandlers>
  552. <httpModules>
  553. <httpModules>
  554. <httpModules>
  555. <httpHandlers>
  556.    
  557. </httpHandlers>
  558. </httpModules>
  559. </httpModules>
  560. </httpModules>
  561. </httpHandlers><httpHandlers>
  562. <httpModules>
  563. <httpModules>
  564. <httpModules>
  565. <httpHandlers>
  566.    
  567. </httpHandlers>
  568. </httpModules>
  569. </httpModules>
  570. </httpModules>
  571. </httpHandlers>app.Context.Handler = handler;<httpHandlers>
  572. <httpModules>
  573. <httpModules>
  574. <httpModules>
  575. <httpHandlers>
  576.    
  577. </httpHandlers>
  578. </httpModules>
  579. </httpModules>
  580. </httpModules>
  581. </httpHandlers><httpHandlers>
  582. <httpModules>
  583. <httpModules>
  584. <httpModules>
  585. <httpHandlers>
  586.    
  587. </httpHandlers>
  588. </httpModules>
  589. </httpModules>
  590. </httpModules>
  591. </httpHandlers>}<httpHandlers>
  592. <httpModules>
  593. <httpModules>
  594. <httpModules>
  595. <httpHandlers>
  596.    
  597. </httpHandlers>
  598. </httpModules>
  599. </httpModules>
  600. </httpModules>
  601. </httpHandlers>}
复制代码
注意:在MyServiceUrlRoutingModule中,我将请求【路由】到一个MyServiceHandler的实例,而不是让Asp.net根据URL来替我选择。
这段代码还个简化的版本,有兴趣的可阅读我的博客 【细说 HttpHandler 的映射过程】
在URL重写的演示中,有些URL相关的属性发生了改变,我们再来看一下URL路由是个什么结果:
7.gif

实现自己的服务框架

本篇博客在开头说过:将在本次博客中改进上次的服务实现,让它成为一个真正能用的服务框架。
前面在讲述Asp.net管线时,给出了很多示例代码,这些示例代码都可以在博客的结尾处下载到。这些代码来源于【我的服务框架】中的部分源代码,下面我将重点介绍【我的服务框架】。

利用【我的服务框架】将类公开成服务

在【我的服务框架】中,一个类要想公开为服务类,并不需要继承某个类或者实现什么接口,只需要在类上加一个特性就好了,方法也只需加一个特性,示例代码如下:
  1. [MyService]public class OrderService{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>[MyServiceMethod]<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>public static string Hello(string name)<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>{<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers><httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>return "Hello " + name;<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers>}<httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>[MyServiceMethod]<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers>public List QueryOrder(QueryOrderCondition query)<httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>{<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers><httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers>// 模拟查询过程,这里就直接返回一个列表。<httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers><httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers><httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers><httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers>List list = new List();<httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers><httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers>for( int i = 0; i < 10; i++ )<httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers><httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers>list.Add(DataFactory.CreateRandomOrder());<httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers><httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers>return list;<httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers>}<httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers>public string HiddenMethod(string aa)<httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers>{<httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers><httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers>// 这个方法应该是不能以服务方式被调用到的。<httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers><httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers>throw new NotImplementedException();<httpHandlers>
  292. <httpModules>
  293. <httpModules>
  294. <httpModules>
  295. <httpHandlers>
  296.    
  297. </httpHandlers>
  298. </httpModules>
  299. </httpModules>
  300. </httpModules>
  301. </httpHandlers>}}
复制代码
如果某个方法需要只公开给登录用户或者指定的用户,还可以使用以下方式:
  1. // 这是一个访问受限的服务类,只允许某些用户调用。[Authorize][MyService]public static class LimitService{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>[Authorize(Users="fish-li, cc")]<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>[MyServiceMethod]<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>public static string CalcPassword(string pwd)<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>{<httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers><httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers>// 这个方法只能由 fish-li, cc 二个用户来调用<httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers><httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers>if( pwd == null )<httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers><httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers><httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers>pwd = string.Empty;<httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers><httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers>byte[] buffer = (new MD5CryptoServiceProvider()).ComputeHash(Encoding.Default.GetBytes(pwd));<httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers><httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers>return BitConverter.ToString(buffer).Replace("-", "");<httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>}<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers>[MyServiceMethod]<httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers>public static string CalcBase64(string str)<httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers>{<httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers><httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers>// 这个方法只能由已登录用户调用。<httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers><httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers>if( string.IsNullOrEmpty(str) )<httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers><httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers><httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers>return string.Empty;<httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers><httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers>return Convert.ToBase64String(Encoding.UTF8.GetBytes(str));<httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers>}}
复制代码
就这么简单,一个类,就可以成为一个服务。
说明:本框架并不要求将服务类在网站项目中实现,完全可以放在类库中实现。
还可以支持Session哦。
  1. [MyService(SessionMode=SessionMode.Support)]public class SessionDemoService {<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>[MyServiceMethod]<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>public int Add(int a)<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>{<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers><httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>// 一个累加的方法,检验是否可以访问Session<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers><httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>if( System.Web.HttpContext.Current.Session == null )<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers><httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers><httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers>throw new InvalidOperationException("Session没有开启。");<httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers><httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers>object obj = System.Web.HttpContext.Current.Session["counter"];<httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers><httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers>int counter = (obj == null ? 0 : (int)obj);<httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>counter += a;<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers><httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers>System.Web.HttpContext.Current.Session["counter"] = counter;<httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers>return counter;<httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers>}}
复制代码
SessionMode的定义如下:
  1. public enum SessionMode{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>NotSupport,<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>Support,<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>ReadOnly}
复制代码
【我的服务框架】支持的序列化的种类

在上篇博客中,我演示了使用JSON序列化的做法来实现一个服务响应。本来也是打算让框架仅支持JSON序列化的,因为传输的数据量小嘛。没想到,做到后来,还是认为有必要把XML序列化也加进来,XML序列化快呀。最后,居然想到既然是服务框架,Ajax调用也能算是服务吧,总不能不支持吧,后来干脆也能支持部分的Ajax调用了。
在【我的服务框架】中,服务端判断客户端发送的数据序列化方式是通过判断请求头"Serializer-Format"来实现的。序列化的种类还允许继续自定义。只要实现以下接口:
  1. public interface ISerializerProvider{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>object Deserialize(Type destType, HttpRequest request);<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>void Serializer(object obj, HttpResponse response);}
复制代码
然后调用以下方法就可以了:
  1. public static class SerializerProviderFactory{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>public static void RegisterSerializerProvider(string name, Type type)<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>{<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers><httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>// ...................................<httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>}
复制代码
判断客户端的序列化方式,由属性FrameworkRules.GetSerializerFormat来决定:
  1. public static class FrameworkRules{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>private static string Internal_GetSerializerFormat(HttpRequest request){<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers><httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>string flag = request.Headers["Serializer-Format"];<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers><httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>return (string.IsNullOrEmpty(flag) ? "form" : flag);<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers>}<httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>private static Func _serializerFormatRule = Internal_GetSerializerFormat;<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers>///<httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers> /// 此委托用来判断客户端发起的请求中,数据是以什么方式序列化的。<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers>/// 返回的结果将会交给SerializerProviderFactory.GetSerializerProvider()来获取序列化提供者<httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers>/// 默认的实现是检查请求头:"Serializer-Format"<httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers>///<httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers> public static Func GetSerializerFormat<httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers>{<httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>internal get { return _serializerFormatRule; }<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers><httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers>set<httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers>{<httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers><httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers><httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers>if( value == null )<httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers><httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers><httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers><httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers>throw new ArgumentNullException("value");<httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers><httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers><httpHandlers>
  292. <httpModules>
  293. <httpModules>
  294. <httpModules>
  295. <httpHandlers>
  296.    
  297. </httpHandlers>
  298. </httpModules>
  299. </httpModules>
  300. </httpModules>
  301. </httpHandlers>_serializerFormatRule = value;<httpHandlers>
  302. <httpModules>
  303. <httpModules>
  304. <httpModules>
  305. <httpHandlers>
  306.    
  307. </httpHandlers>
  308. </httpModules>
  309. </httpModules>
  310. </httpModules>
  311. </httpHandlers><httpHandlers>
  312. <httpModules>
  313. <httpModules>
  314. <httpModules>
  315. <httpHandlers>
  316.    
  317. </httpHandlers>
  318. </httpModules>
  319. </httpModules>
  320. </httpModules>
  321. </httpHandlers>}<httpHandlers>
  322. <httpModules>
  323. <httpModules>
  324. <httpModules>
  325. <httpHandlers>
  326.    
  327. </httpHandlers>
  328. </httpModules>
  329. </httpModules>
  330. </httpModules>
  331. </httpHandlers>}
复制代码
只是一个委托,可以自己重新实现。
目前本框架提供了三个实现了接口ISerializerProvider的类供用户使用:JsonSerializerProvider, XmlSerializerProvider, FormSerializerProvider
这里只展示JsonSerializerProvider的实现:
  1. internal class JsonSerializerProvider : ISerializerProvider{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>private static readonly MethodInfo s_JSSDeserializeMI<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers><httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers><httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers><httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers><httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers><httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers><httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers><httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>= typeof(JavaScriptSerializer).GetMethod("Deserialize");<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers>JavaScriptSerializer jss = new JavaScriptSerializer();<httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers>public object Deserialize(Type destType, HttpRequest request)<httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers>{<httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers><httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers>StreamReader sr = new StreamReader(request.InputStream, request.ContentEncoding);<httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>string input = sr.ReadToEnd();<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers><httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers>MethodInfo deserialize = s_JSSDeserializeMI.MakeGenericMethod(destType);<httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers>return deserialize.Invoke(jss, new object[] { input });<httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers>}<httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers>public void Serializer(object obj, HttpResponse response)<httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers>{<httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers><httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers>if( obj == null )<httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers><httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers><httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers>return;<httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers><httpHandlers>
  292. <httpModules>
  293. <httpModules>
  294. <httpModules>
  295. <httpHandlers>
  296.    
  297. </httpHandlers>
  298. </httpModules>
  299. </httpModules>
  300. </httpModules>
  301. </httpHandlers>response.ContentType = "application/json";<httpHandlers>
  302. <httpModules>
  303. <httpModules>
  304. <httpModules>
  305. <httpHandlers>
  306.    
  307. </httpHandlers>
  308. </httpModules>
  309. </httpModules>
  310. </httpModules>
  311. </httpHandlers><httpHandlers>
  312. <httpModules>
  313. <httpModules>
  314. <httpModules>
  315. <httpHandlers>
  316.    
  317. </httpHandlers>
  318. </httpModules>
  319. </httpModules>
  320. </httpModules>
  321. </httpHandlers>response.Write(jss.Serialize(obj));<httpHandlers>
  322. <httpModules>
  323. <httpModules>
  324. <httpModules>
  325. <httpHandlers>
  326.    
  327. </httpHandlers>
  328. </httpModules>
  329. </httpModules>
  330. </httpModules>
  331. </httpHandlers>}
复制代码
注意:FormSerializerProvider的实现不够完善,因为再搞下去,就和【我的WEB框架】就重复了。有兴趣的自己去完善吧。
这里再给自己的作品打个广告:
【Asp.net MVC 框架,我也来山寨一下】, 【晒晒我的Ajax服务端框架】, 【我的Ajax服务端框架 - (1) JS直接调用C#方法】
【我的服务框架】对gzip的支持

对于gzip的支持,我只想说:太简单了。
前面不是已给出DuplexGzipModule的实现代码嘛。是的,就是把它注册到web.config中就可以了。
你说简不简单? 完全不用写多余的代码,要不要gzip支持,也只是个配置问题!
说到这里,我想起前段时间Artech写的一篇博客通过WCF扩展实现消息压缩,正如我在前篇博客的回复中说到的:“本来真没兴趣看的,不过,为了验证我的猜想,还是去看了一下,果然也没让我失望。”。
在此,有必要公开一下我的想法:绝对没有半点看不起Artech的意思,只是我对WCF没有兴趣了。理由也简单:不够简单。
还是接着说,Artech的博客展示了在WCF中压缩消息的方式,当然我相信Artech对于WCF的理解,他的方案或许应该是最简单的解决方案,但是和【我的服务框架】对gzip的支持的易用性根本没法比。
WCF的粉丝们,当您看到这里,请先别忙着喷我。听我说完:WCF的确很强大,我的这个不到700行的框架那也是根本不能和它相比的。
做这个比较仅仅是为了展示Asp.net是一个强大的平台,Asp.net有更高水准的扩展性。
利用【我的服务框架】发布服务的5种方式

【我的服务框架】可以提供5种不同的方式,让您将一个类及方法公开成一个服务,供外界调用。
方法1:使用DirectProcessRequestMoudle,只需要配置web.config即可。
  1. <httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>
复制代码
客户端调用URL:http://localhost:11647/service/OrderService/QueryOrder
说明:URL模式是可以自由定义的,只要给FrameworkRules.ParseNamesPair赋值即可,它的定义如下:
  1. public static Func<HttpRequest, NamesPair> ParseNamesPair
复制代码
默认的实现方式:
  1. internal static class UrlPatternHelper{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>// 为了演示简单,我只定义一个URL模式。【因为我认为对于服务来说,一个就够了】<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>// 如果希望适用性更广,可以从配置文件中读取,并且可支持多组URL模式。<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>// URL中加了"/service/"只是为了能更好地区分其它请求,如果您的网站没有子目录,删除它也是可以的。<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>internal static readonly string ServicePattern = @"/service/(?[^/]+)/(?[^/]+)[/\?]?";<httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers><httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers>public static NamesPair ParseNamesPair(HttpRequest request)<httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>{<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers><httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>if( request == null )<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers><httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers><httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers>throw new ArgumentNullException("request");<httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers><httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers>Match match = Regex.Match(request.Path, ServicePattern);<httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>if( match.Success == false )<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers><httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers><httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers>return null;<httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers><httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers>return new NamesPair {<httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers><httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers><httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers>ServiceName = match.Groups["name"].Value,<httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers><httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers><httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers>MethodName = match.Groups["method"].Value<httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers><httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers>};<httpHandlers>
  292. <httpModules>
  293. <httpModules>
  294. <httpModules>
  295. <httpHandlers>
  296.    
  297. </httpHandlers>
  298. </httpModules>
  299. </httpModules>
  300. </httpModules>
  301. </httpHandlers>}
复制代码
客户端调用URL:  http://localhost:11647/service/OrderService/QueryOrder

方法2:使用MyServiceUrlRoutingModule,只需要配置web.config即可。
  1. <httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>
复制代码
客户端调用URL:  http://localhost:11647/service/OrderService/QueryOrder
说明:只有这种方式才能支持Session

方法3:使用MyServiceUrlRewriteModule,只需要配置web.config即可。
  1. <httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers><httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>
复制代码
客户端调用URL:  http://localhost:11647/service/OrderService/QueryOrder

方法4:使用MyServiceHandler,只需要配置web.config即可。
  1. <httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>
复制代码
客户端调用URL:  http://localhost:11647/MyService.axd?sc=OrderService&op=QueryOrder

方法5:创建一个ashx,不需要任何配置。
  1. using System;using System.Web;using MySimpleServiceFramework;public class MyService : IHttpHandler {<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers><httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>public void ProcessRequest (HttpContext context) {<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers><httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>NamesPair pair = new NamesPair();<httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers><httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers>pair.ServiceName = context.Request.QueryString["sc"];<httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers><httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers>pair.MethodName = context.Request.QueryString["op"];<httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers><httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers>ServiceExecutor.ProcessRequest(context, pair);<httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers>}<httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers> public bool IsReusable {<httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers><httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers>get {<httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers><httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers>return false;<httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers><httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers>}<httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers>}}
复制代码
客户端调用URL:  http://localhost:11647/MyService.ashx?sc=OrderService&op=QueryOrder

注意:前三种方法,需要在IIS中做些额外的配置,因为URL中不包含文件扩展名了,IIS不知道把请求交给Asp.net来处理。
具体配置见下图,此处省略78个字。
8.gif

我对发布服务的5种方式的建议

虽然,我给出了5种发布方式,但是我还是想说说我个人的想法。
在这些方法中,使用URL重写,URL路由的方法,并不是我想推荐的,写它们是主要是为了展示HttpModule 。不推荐它们是因为它们要判断URL是否符合指定模式,这个判断是有成本的。至于成本有多高,特此,我专了做门的测试。在示例代码压缩包中有个___TestRoutePerformance目录,结果如何,还是您自己去看吧,我也有点累了。
此外,我想问:对于服务来说,URL友好有多大意义?服务的URL会让用户来输入还是让Google的爬虫来访问?
如果以上二个问题都是否定的,那么,这二种方法就是在白白浪费机器的性能了。
当然了,如果您的站点访问量不大,那么这点性能也可以忽略不计了,就当我没说。
使用URL重写URL路由,还有个比较麻烦的事情:如果想通过URL多传递一个参数,那么,是不是又要修改URL模式?
对于使用DirectProcessRequestMoudle这种模式,我以前已经说过了:除非要很好的理由,否则不建议使用这种方法。
至于其它的二种方式,本质上是一样的,只是说:处理器谁来写的差别了。
不过,如果您要是选择手工创建一个处理器,除了不用修改web.config之外,还可以自定义URL参数名,可以选择要不要支持Session
【我的服务框架】的一些核心类

ReflectionHelper类用于根据类名及服务名定位到一个服务类型以及要调用的方法。
因此,它在框架中的作用也是非常关键的。
  1. internal static class ReflectionHelper{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>private static List s_typeList;<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>static ReflectionHelper()<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers>{<httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers><httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers>InitServiceTypes();<httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers>}<httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>///<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers> /// 加载所有的服务类型,判断方式就是检查类型是否有MyServiceAttribute<httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>///<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers> private static void InitServiceTypes()<httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers>{<httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers><httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers>s_typeList = new List(256);<httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers><httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers>ICollection assemblies = BuildManager.GetReferencedAssemblies();<httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers><httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers>foreach( Assembly assembly in assemblies ) {<httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers><httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers>try {<httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers><httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers><httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers><httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers>(from t in assembly.GetExportedTypes()<httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers><httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers><httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers><httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers> let a = (MyServiceAttribute[])t.GetCustomAttributes(typeof(MyServiceAttribute), false)<httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers><httpHandlers>
  292. <httpModules>
  293. <httpModules>
  294. <httpModules>
  295. <httpHandlers>
  296.    
  297. </httpHandlers>
  298. </httpModules>
  299. </httpModules>
  300. </httpModules>
  301. </httpHandlers><httpHandlers>
  302. <httpModules>
  303. <httpModules>
  304. <httpModules>
  305. <httpHandlers>
  306.    
  307. </httpHandlers>
  308. </httpModules>
  309. </httpModules>
  310. </httpModules>
  311. </httpHandlers><httpHandlers>
  312. <httpModules>
  313. <httpModules>
  314. <httpModules>
  315. <httpHandlers>
  316.    
  317. </httpHandlers>
  318. </httpModules>
  319. </httpModules>
  320. </httpModules>
  321. </httpHandlers> where a.Length > 0<httpHandlers>
  322. <httpModules>
  323. <httpModules>
  324. <httpModules>
  325. <httpHandlers>
  326.    
  327. </httpHandlers>
  328. </httpModules>
  329. </httpModules>
  330. </httpModules>
  331. </httpHandlers><httpHandlers>
  332. <httpModules>
  333. <httpModules>
  334. <httpModules>
  335. <httpHandlers>
  336.    
  337. </httpHandlers>
  338. </httpModules>
  339. </httpModules>
  340. </httpModules>
  341. </httpHandlers><httpHandlers>
  342. <httpModules>
  343. <httpModules>
  344. <httpModules>
  345. <httpHandlers>
  346.    
  347. </httpHandlers>
  348. </httpModules>
  349. </httpModules>
  350. </httpModules>
  351. </httpHandlers><httpHandlers>
  352. <httpModules>
  353. <httpModules>
  354. <httpModules>
  355. <httpHandlers>
  356.    
  357. </httpHandlers>
  358. </httpModules>
  359. </httpModules>
  360. </httpModules>
  361. </httpHandlers> select new TypeAndAttrInfo {<httpHandlers>
  362. <httpModules>
  363. <httpModules>
  364. <httpModules>
  365. <httpHandlers>
  366.    
  367. </httpHandlers>
  368. </httpModules>
  369. </httpModules>
  370. </httpModules>
  371. </httpHandlers><httpHandlers>
  372. <httpModules>
  373. <httpModules>
  374. <httpModules>
  375. <httpHandlers>
  376.    
  377. </httpHandlers>
  378. </httpModules>
  379. </httpModules>
  380. </httpModules>
  381. </httpHandlers><httpHandlers>
  382. <httpModules>
  383. <httpModules>
  384. <httpModules>
  385. <httpHandlers>
  386.    
  387. </httpHandlers>
  388. </httpModules>
  389. </httpModules>
  390. </httpModules>
  391. </httpHandlers><httpHandlers>
  392. <httpModules>
  393. <httpModules>
  394. <httpModules>
  395. <httpHandlers>
  396.    
  397. </httpHandlers>
  398. </httpModules>
  399. </httpModules>
  400. </httpModules>
  401. </httpHandlers><httpHandlers>
  402. <httpModules>
  403. <httpModules>
  404. <httpModules>
  405. <httpHandlers>
  406.    
  407. </httpHandlers>
  408. </httpModules>
  409. </httpModules>
  410. </httpModules>
  411. </httpHandlers><httpHandlers>
  412. <httpModules>
  413. <httpModules>
  414. <httpModules>
  415. <httpHandlers>
  416.    
  417. </httpHandlers>
  418. </httpModules>
  419. </httpModules>
  420. </httpModules>
  421. </httpHandlers><httpHandlers>
  422. <httpModules>
  423. <httpModules>
  424. <httpModules>
  425. <httpHandlers>
  426.    
  427. </httpHandlers>
  428. </httpModules>
  429. </httpModules>
  430. </httpModules>
  431. </httpHandlers> ServiceType = t, Attr = a[0], AuthorizeAttr = t.GetClassAuthorizeAttribute() }<httpHandlers>
  432. <httpModules>
  433. <httpModules>
  434. <httpModules>
  435. <httpHandlers>
  436.    
  437. </httpHandlers>
  438. </httpModules>
  439. </httpModules>
  440. </httpModules>
  441. </httpHandlers><httpHandlers>
  442. <httpModules>
  443. <httpModules>
  444. <httpModules>
  445. <httpHandlers>
  446.    
  447. </httpHandlers>
  448. </httpModules>
  449. </httpModules>
  450. </httpModules>
  451. </httpHandlers><httpHandlers>
  452. <httpModules>
  453. <httpModules>
  454. <httpModules>
  455. <httpHandlers>
  456.    
  457. </httpHandlers>
  458. </httpModules>
  459. </httpModules>
  460. </httpModules>
  461. </httpHandlers><httpHandlers>
  462. <httpModules>
  463. <httpModules>
  464. <httpModules>
  465. <httpHandlers>
  466.    
  467. </httpHandlers>
  468. </httpModules>
  469. </httpModules>
  470. </httpModules>
  471. </httpHandlers> ).ToList().ForEach(b => s_typeList.Add(b));<httpHandlers>
  472. <httpModules>
  473. <httpModules>
  474. <httpModules>
  475. <httpHandlers>
  476.    
  477. </httpHandlers>
  478. </httpModules>
  479. </httpModules>
  480. </httpModules>
  481. </httpHandlers><httpHandlers>
  482. <httpModules>
  483. <httpModules>
  484. <httpModules>
  485. <httpHandlers>
  486.    
  487. </httpHandlers>
  488. </httpModules>
  489. </httpModules>
  490. </httpModules>
  491. </httpHandlers><httpHandlers>
  492. <httpModules>
  493. <httpModules>
  494. <httpModules>
  495. <httpHandlers>
  496.    
  497. </httpHandlers>
  498. </httpModules>
  499. </httpModules>
  500. </httpModules>
  501. </httpHandlers>}<httpHandlers>
  502. <httpModules>
  503. <httpModules>
  504. <httpModules>
  505. <httpHandlers>
  506.    
  507. </httpHandlers>
  508. </httpModules>
  509. </httpModules>
  510. </httpModules>
  511. </httpHandlers><httpHandlers>
  512. <httpModules>
  513. <httpModules>
  514. <httpModules>
  515. <httpHandlers>
  516.    
  517. </httpHandlers>
  518. </httpModules>
  519. </httpModules>
  520. </httpModules>
  521. </httpHandlers><httpHandlers>
  522. <httpModules>
  523. <httpModules>
  524. <httpModules>
  525. <httpHandlers>
  526.    
  527. </httpHandlers>
  528. </httpModules>
  529. </httpModules>
  530. </httpModules>
  531. </httpHandlers>catch { }<httpHandlers>
  532. <httpModules>
  533. <httpModules>
  534. <httpModules>
  535. <httpHandlers>
  536.    
  537. </httpHandlers>
  538. </httpModules>
  539. </httpModules>
  540. </httpModules>
  541. </httpHandlers><httpHandlers>
  542. <httpModules>
  543. <httpModules>
  544. <httpModules>
  545. <httpHandlers>
  546.    
  547. </httpHandlers>
  548. </httpModules>
  549. </httpModules>
  550. </httpModules>
  551. </httpHandlers>}<httpHandlers>
  552. <httpModules>
  553. <httpModules>
  554. <httpModules>
  555. <httpHandlers>
  556.    
  557. </httpHandlers>
  558. </httpModules>
  559. </httpModules>
  560. </httpModules>
  561. </httpHandlers>}<httpHandlers>
  562. <httpModules>
  563. <httpModules>
  564. <httpModules>
  565. <httpHandlers>
  566.    
  567. </httpHandlers>
  568. </httpModules>
  569. </httpModules>
  570. </httpModules>
  571. </httpHandlers>private static AuthorizeAttribute GetClassAuthorizeAttribute(this Type t)<httpHandlers>
  572. <httpModules>
  573. <httpModules>
  574. <httpModules>
  575. <httpHandlers>
  576.    
  577. </httpHandlers>
  578. </httpModules>
  579. </httpModules>
  580. </httpModules>
  581. </httpHandlers>{<httpHandlers>
  582. <httpModules>
  583. <httpModules>
  584. <httpModules>
  585. <httpHandlers>
  586.    
  587. </httpHandlers>
  588. </httpModules>
  589. </httpModules>
  590. </httpModules>
  591. </httpHandlers><httpHandlers>
  592. <httpModules>
  593. <httpModules>
  594. <httpModules>
  595. <httpHandlers>
  596.    
  597. </httpHandlers>
  598. </httpModules>
  599. </httpModules>
  600. </httpModules>
  601. </httpHandlers>AuthorizeAttribute[] attrs = (AuthorizeAttribute[])t.GetCustomAttributes(typeof(AuthorizeAttribute), false);<httpHandlers>
  602. <httpModules>
  603. <httpModules>
  604. <httpModules>
  605. <httpHandlers>
  606.    
  607. </httpHandlers>
  608. </httpModules>
  609. </httpModules>
  610. </httpModules>
  611. </httpHandlers><httpHandlers>
  612. <httpModules>
  613. <httpModules>
  614. <httpModules>
  615. <httpHandlers>
  616.    
  617. </httpHandlers>
  618. </httpModules>
  619. </httpModules>
  620. </httpModules>
  621. </httpHandlers>return (attrs.Length > 0 ? attrs[0] : null);<httpHandlers>
  622. <httpModules>
  623. <httpModules>
  624. <httpModules>
  625. <httpHandlers>
  626.    
  627. </httpHandlers>
  628. </httpModules>
  629. </httpModules>
  630. </httpModules>
  631. </httpHandlers>}<httpHandlers>
  632. <httpModules>
  633. <httpModules>
  634. <httpModules>
  635. <httpHandlers>
  636.    
  637. </httpHandlers>
  638. </httpModules>
  639. </httpModules>
  640. </httpModules>
  641. </httpHandlers>///<httpHandlers>
  642. <httpModules>
  643. <httpModules>
  644. <httpModules>
  645. <httpHandlers>
  646.    
  647. </httpHandlers>
  648. </httpModules>
  649. </httpModules>
  650. </httpModules>
  651. </httpHandlers> /// 根据一个名称获取对应的服务类型(从缓存中获取类型)<httpHandlers>
  652. <httpModules>
  653. <httpModules>
  654. <httpModules>
  655. <httpHandlers>
  656.    
  657. </httpHandlers>
  658. </httpModules>
  659. </httpModules>
  660. </httpModules>
  661. </httpHandlers>///<httpHandlers>
  662. <httpModules>
  663. <httpModules>
  664. <httpModules>
  665. <httpHandlers>
  666.    
  667. </httpHandlers>
  668. </httpModules>
  669. </httpModules>
  670. </httpModules>
  671. </httpHandlers> ///<httpHandlers>
  672. <httpModules>
  673. <httpModules>
  674. <httpModules>
  675. <httpHandlers>
  676.    
  677. </httpHandlers>
  678. </httpModules>
  679. </httpModules>
  680. </httpModules>
  681. </httpHandlers> ///<httpHandlers>
  682. <httpModules>
  683. <httpModules>
  684. <httpModules>
  685. <httpHandlers>
  686.    
  687. </httpHandlers>
  688. </httpModules>
  689. </httpModules>
  690. </httpModules>
  691. </httpHandlers> private static TypeAndAttrInfo GetServiceType(string typeName)<httpHandlers>
  692. <httpModules>
  693. <httpModules>
  694. <httpModules>
  695. <httpHandlers>
  696.    
  697. </httpHandlers>
  698. </httpModules>
  699. </httpModules>
  700. </httpModules>
  701. </httpHandlers>{<httpHandlers>
  702. <httpModules>
  703. <httpModules>
  704. <httpModules>
  705. <httpHandlers>
  706.    
  707. </httpHandlers>
  708. </httpModules>
  709. </httpModules>
  710. </httpModules>
  711. </httpHandlers><httpHandlers>
  712. <httpModules>
  713. <httpModules>
  714. <httpModules>
  715. <httpHandlers>
  716.    
  717. </httpHandlers>
  718. </httpModules>
  719. </httpModules>
  720. </httpModules>
  721. </httpHandlers>if( string.IsNullOrEmpty(typeName) )<httpHandlers>
  722. <httpModules>
  723. <httpModules>
  724. <httpModules>
  725. <httpHandlers>
  726.    
  727. </httpHandlers>
  728. </httpModules>
  729. </httpModules>
  730. </httpModules>
  731. </httpHandlers><httpHandlers>
  732. <httpModules>
  733. <httpModules>
  734. <httpModules>
  735. <httpHandlers>
  736.    
  737. </httpHandlers>
  738. </httpModules>
  739. </httpModules>
  740. </httpModules>
  741. </httpHandlers><httpHandlers>
  742. <httpModules>
  743. <httpModules>
  744. <httpModules>
  745. <httpHandlers>
  746.    
  747. </httpHandlers>
  748. </httpModules>
  749. </httpModules>
  750. </httpModules>
  751. </httpHandlers>throw new ArgumentNullException("typeName");<httpHandlers>
  752. <httpModules>
  753. <httpModules>
  754. <httpModules>
  755. <httpHandlers>
  756.    
  757. </httpHandlers>
  758. </httpModules>
  759. </httpModules>
  760. </httpModules>
  761. </httpHandlers><httpHandlers>
  762. <httpModules>
  763. <httpModules>
  764. <httpModules>
  765. <httpHandlers>
  766.    
  767. </httpHandlers>
  768. </httpModules>
  769. </httpModules>
  770. </httpModules>
  771. </httpHandlers>// 查找类型的方式:如果有点号,则按全名来查找(包含命名空间),否则只看名字。<httpHandlers>
  772. <httpModules>
  773. <httpModules>
  774. <httpModules>
  775. <httpHandlers>
  776.    
  777. </httpHandlers>
  778. </httpModules>
  779. </httpModules>
  780. </httpModules>
  781. </httpHandlers><httpHandlers>
  782. <httpModules>
  783. <httpModules>
  784. <httpModules>
  785. <httpHandlers>
  786.    
  787. </httpHandlers>
  788. </httpModules>
  789. </httpModules>
  790. </httpModules>
  791. </httpHandlers>// 本框架对于多个匹配条件的类型,将返回第一个匹配项。<httpHandlers>
  792. <httpModules>
  793. <httpModules>
  794. <httpModules>
  795. <httpHandlers>
  796.    
  797. </httpHandlers>
  798. </httpModules>
  799. </httpModules>
  800. </httpModules>
  801. </httpHandlers><httpHandlers>
  802. <httpModules>
  803. <httpModules>
  804. <httpModules>
  805. <httpHandlers>
  806.    
  807. </httpHandlers>
  808. </httpModules>
  809. </httpModules>
  810. </httpModules>
  811. </httpHandlers>if( typeName.IndexOf('.') > 0 )<httpHandlers>
  812. <httpModules>
  813. <httpModules>
  814. <httpModules>
  815. <httpHandlers>
  816.    
  817. </httpHandlers>
  818. </httpModules>
  819. </httpModules>
  820. </httpModules>
  821. </httpHandlers><httpHandlers>
  822. <httpModules>
  823. <httpModules>
  824. <httpModules>
  825. <httpHandlers>
  826.    
  827. </httpHandlers>
  828. </httpModules>
  829. </httpModules>
  830. </httpModules>
  831. </httpHandlers><httpHandlers>
  832. <httpModules>
  833. <httpModules>
  834. <httpModules>
  835. <httpHandlers>
  836.    
  837. </httpHandlers>
  838. </httpModules>
  839. </httpModules>
  840. </httpModules>
  841. </httpHandlers>return s_typeList.FirstOrDefault(t => string.Compare(t.ServiceType.FullName, typeName, true) == 0);<httpHandlers>
  842. <httpModules>
  843. <httpModules>
  844. <httpModules>
  845. <httpHandlers>
  846.    
  847. </httpHandlers>
  848. </httpModules>
  849. </httpModules>
  850. </httpModules>
  851. </httpHandlers><httpHandlers>
  852. <httpModules>
  853. <httpModules>
  854. <httpModules>
  855. <httpHandlers>
  856.    
  857. </httpHandlers>
  858. </httpModules>
  859. </httpModules>
  860. </httpModules>
  861. </httpHandlers>else<httpHandlers>
  862. <httpModules>
  863. <httpModules>
  864. <httpModules>
  865. <httpHandlers>
  866.    
  867. </httpHandlers>
  868. </httpModules>
  869. </httpModules>
  870. </httpModules>
  871. </httpHandlers><httpHandlers>
  872. <httpModules>
  873. <httpModules>
  874. <httpModules>
  875. <httpHandlers>
  876.    
  877. </httpHandlers>
  878. </httpModules>
  879. </httpModules>
  880. </httpModules>
  881. </httpHandlers><httpHandlers>
  882. <httpModules>
  883. <httpModules>
  884. <httpModules>
  885. <httpHandlers>
  886.    
  887. </httpHandlers>
  888. </httpModules>
  889. </httpModules>
  890. </httpModules>
  891. </httpHandlers>return s_typeList.FirstOrDefault(t => string.Compare(t.ServiceType.Name, typeName, true) == 0);<httpHandlers>
  892. <httpModules>
  893. <httpModules>
  894. <httpModules>
  895. <httpHandlers>
  896.    
  897. </httpHandlers>
  898. </httpModules>
  899. </httpModules>
  900. </httpModules>
  901. </httpHandlers>}<httpHandlers>
  902. <httpModules>
  903. <httpModules>
  904. <httpModules>
  905. <httpHandlers>
  906.    
  907. </httpHandlers>
  908. </httpModules>
  909. </httpModules>
  910. </httpModules>
  911. </httpHandlers><httpHandlers>
  912. <httpModules>
  913. <httpModules>
  914. <httpModules>
  915. <httpHandlers>
  916.    
  917. </httpHandlers>
  918. </httpModules>
  919. </httpModules>
  920. </httpModules>
  921. </httpHandlers><httpHandlers>
  922. <httpModules>
  923. <httpModules>
  924. <httpModules>
  925. <httpHandlers>
  926.    
  927. </httpHandlers>
  928. </httpModules>
  929. </httpModules>
  930. </httpModules>
  931. </httpHandlers>private static Hashtable s_methodTable = Hashtable.Synchronized(<httpHandlers>
  932. <httpModules>
  933. <httpModules>
  934. <httpModules>
  935. <httpHandlers>
  936.    
  937. </httpHandlers>
  938. </httpModules>
  939. </httpModules>
  940. </httpModules>
  941. </httpHandlers><httpHandlers>
  942. <httpModules>
  943. <httpModules>
  944. <httpModules>
  945. <httpHandlers>
  946.    
  947. </httpHandlers>
  948. </httpModules>
  949. </httpModules>
  950. </httpModules>
  951. </httpHandlers><httpHandlers>
  952. <httpModules>
  953. <httpModules>
  954. <httpModules>
  955. <httpHandlers>
  956.    
  957. </httpHandlers>
  958. </httpModules>
  959. </httpModules>
  960. </httpModules>
  961. </httpHandlers><httpHandlers>
  962. <httpModules>
  963. <httpModules>
  964. <httpModules>
  965. <httpHandlers>
  966.    
  967. </httpHandlers>
  968. </httpModules>
  969. </httpModules>
  970. </httpModules>
  971. </httpHandlers><httpHandlers>
  972. <httpModules>
  973. <httpModules>
  974. <httpModules>
  975. <httpHandlers>
  976.    
  977. </httpHandlers>
  978. </httpModules>
  979. </httpModules>
  980. </httpModules>
  981. </httpHandlers><httpHandlers>
  982. <httpModules>
  983. <httpModules>
  984. <httpModules>
  985. <httpHandlers>
  986.    
  987. </httpHandlers>
  988. </httpModules>
  989. </httpModules>
  990. </httpModules>
  991. </httpHandlers><httpHandlers>
  992. <httpModules>
  993. <httpModules>
  994. <httpModules>
  995. <httpHandlers>
  996.    
  997. </httpHandlers>
  998. </httpModules>
  999. </httpModules>
  1000. </httpModules>
  1001. </httpHandlers><httpHandlers>
  1002. <httpModules>
  1003. <httpModules>
  1004. <httpModules>
  1005. <httpHandlers>
  1006.    
  1007. </httpHandlers>
  1008. </httpModules>
  1009. </httpModules>
  1010. </httpModules>
  1011. </httpHandlers><httpHandlers>
  1012. <httpModules>
  1013. <httpModules>
  1014. <httpModules>
  1015. <httpHandlers>
  1016.    
  1017. </httpHandlers>
  1018. </httpModules>
  1019. </httpModules>
  1020. </httpModules>
  1021. </httpHandlers><httpHandlers>
  1022. <httpModules>
  1023. <httpModules>
  1024. <httpModules>
  1025. <httpHandlers>
  1026.    
  1027. </httpHandlers>
  1028. </httpModules>
  1029. </httpModules>
  1030. </httpModules>
  1031. </httpHandlers>new Hashtable(4096, StringComparer.OrdinalIgnoreCase));<httpHandlers>
  1032. <httpModules>
  1033. <httpModules>
  1034. <httpModules>
  1035. <httpHandlers>
  1036.    
  1037. </httpHandlers>
  1038. </httpModules>
  1039. </httpModules>
  1040. </httpModules>
  1041. </httpHandlers>///<httpHandlers>
  1042. <httpModules>
  1043. <httpModules>
  1044. <httpModules>
  1045. <httpHandlers>
  1046.    
  1047. </httpHandlers>
  1048. </httpModules>
  1049. </httpModules>
  1050. </httpModules>
  1051. </httpHandlers> /// 根据指定的类型以及方法名称,获取对应的方法信息<httpHandlers>
  1052. <httpModules>
  1053. <httpModules>
  1054. <httpModules>
  1055. <httpHandlers>
  1056.    
  1057. </httpHandlers>
  1058. </httpModules>
  1059. </httpModules>
  1060. </httpModules>
  1061. </httpHandlers>///<httpHandlers>
  1062. <httpModules>
  1063. <httpModules>
  1064. <httpModules>
  1065. <httpHandlers>
  1066.    
  1067. </httpHandlers>
  1068. </httpModules>
  1069. </httpModules>
  1070. </httpModules>
  1071. </httpHandlers> ///<httpHandlers>
  1072. <httpModules>
  1073. <httpModules>
  1074. <httpModules>
  1075. <httpHandlers>
  1076.    
  1077. </httpHandlers>
  1078. </httpModules>
  1079. </httpModules>
  1080. </httpModules>
  1081. </httpHandlers> ///<httpHandlers>
  1082. <httpModules>
  1083. <httpModules>
  1084. <httpModules>
  1085. <httpHandlers>
  1086.    
  1087. </httpHandlers>
  1088. </httpModules>
  1089. </httpModules>
  1090. </httpModules>
  1091. </httpHandlers> ///<httpHandlers>
  1092. <httpModules>
  1093. <httpModules>
  1094. <httpModules>
  1095. <httpHandlers>
  1096.    
  1097. </httpHandlers>
  1098. </httpModules>
  1099. </httpModules>
  1100. </httpModules>
  1101. </httpHandlers> private static MethodAndAttrInfo GetServiceMethod(Type type, string methodName)<httpHandlers>
  1102. <httpModules>
  1103. <httpModules>
  1104. <httpModules>
  1105. <httpHandlers>
  1106.    
  1107. </httpHandlers>
  1108. </httpModules>
  1109. </httpModules>
  1110. </httpModules>
  1111. </httpHandlers>{<httpHandlers>
  1112. <httpModules>
  1113. <httpModules>
  1114. <httpModules>
  1115. <httpHandlers>
  1116.    
  1117. </httpHandlers>
  1118. </httpModules>
  1119. </httpModules>
  1120. </httpModules>
  1121. </httpHandlers><httpHandlers>
  1122. <httpModules>
  1123. <httpModules>
  1124. <httpModules>
  1125. <httpHandlers>
  1126.    
  1127. </httpHandlers>
  1128. </httpModules>
  1129. </httpModules>
  1130. </httpModules>
  1131. </httpHandlers>if( type == null )<httpHandlers>
  1132. <httpModules>
  1133. <httpModules>
  1134. <httpModules>
  1135. <httpHandlers>
  1136.    
  1137. </httpHandlers>
  1138. </httpModules>
  1139. </httpModules>
  1140. </httpModules>
  1141. </httpHandlers><httpHandlers>
  1142. <httpModules>
  1143. <httpModules>
  1144. <httpModules>
  1145. <httpHandlers>
  1146.    
  1147. </httpHandlers>
  1148. </httpModules>
  1149. </httpModules>
  1150. </httpModules>
  1151. </httpHandlers><httpHandlers>
  1152. <httpModules>
  1153. <httpModules>
  1154. <httpModules>
  1155. <httpHandlers>
  1156.    
  1157. </httpHandlers>
  1158. </httpModules>
  1159. </httpModules>
  1160. </httpModules>
  1161. </httpHandlers>throw new ArgumentNullException("type");<httpHandlers>
  1162. <httpModules>
  1163. <httpModules>
  1164. <httpModules>
  1165. <httpHandlers>
  1166.    
  1167. </httpHandlers>
  1168. </httpModules>
  1169. </httpModules>
  1170. </httpModules>
  1171. </httpHandlers><httpHandlers>
  1172. <httpModules>
  1173. <httpModules>
  1174. <httpModules>
  1175. <httpHandlers>
  1176.    
  1177. </httpHandlers>
  1178. </httpModules>
  1179. </httpModules>
  1180. </httpModules>
  1181. </httpHandlers>if( string.IsNullOrEmpty(methodName))<httpHandlers>
  1182. <httpModules>
  1183. <httpModules>
  1184. <httpModules>
  1185. <httpHandlers>
  1186.    
  1187. </httpHandlers>
  1188. </httpModules>
  1189. </httpModules>
  1190. </httpModules>
  1191. </httpHandlers><httpHandlers>
  1192. <httpModules>
  1193. <httpModules>
  1194. <httpModules>
  1195. <httpHandlers>
  1196.    
  1197. </httpHandlers>
  1198. </httpModules>
  1199. </httpModules>
  1200. </httpModules>
  1201. </httpHandlers><httpHandlers>
  1202. <httpModules>
  1203. <httpModules>
  1204. <httpModules>
  1205. <httpHandlers>
  1206.    
  1207. </httpHandlers>
  1208. </httpModules>
  1209. </httpModules>
  1210. </httpModules>
  1211. </httpHandlers>throw new ArgumentNullException("methodName");<httpHandlers>
  1212. <httpModules>
  1213. <httpModules>
  1214. <httpModules>
  1215. <httpHandlers>
  1216.    
  1217. </httpHandlers>
  1218. </httpModules>
  1219. </httpModules>
  1220. </httpModules>
  1221. </httpHandlers><httpHandlers>
  1222. <httpModules>
  1223. <httpModules>
  1224. <httpModules>
  1225. <httpHandlers>
  1226.    
  1227. </httpHandlers>
  1228. </httpModules>
  1229. </httpModules>
  1230. </httpModules>
  1231. </httpHandlers>// 首先尝试从缓存中读取<httpHandlers>
  1232. <httpModules>
  1233. <httpModules>
  1234. <httpModules>
  1235. <httpHandlers>
  1236.    
  1237. </httpHandlers>
  1238. </httpModules>
  1239. </httpModules>
  1240. </httpModules>
  1241. </httpHandlers><httpHandlers>
  1242. <httpModules>
  1243. <httpModules>
  1244. <httpModules>
  1245. <httpHandlers>
  1246.    
  1247. </httpHandlers>
  1248. </httpModules>
  1249. </httpModules>
  1250. </httpModules>
  1251. </httpHandlers>string key = methodName + "@" + type.FullName;<httpHandlers>
  1252. <httpModules>
  1253. <httpModules>
  1254. <httpModules>
  1255. <httpHandlers>
  1256.    
  1257. </httpHandlers>
  1258. </httpModules>
  1259. </httpModules>
  1260. </httpModules>
  1261. </httpHandlers><httpHandlers>
  1262. <httpModules>
  1263. <httpModules>
  1264. <httpModules>
  1265. <httpHandlers>
  1266.    
  1267. </httpHandlers>
  1268. </httpModules>
  1269. </httpModules>
  1270. </httpModules>
  1271. </httpHandlers>MethodAndAttrInfo mi = (MethodAndAttrInfo)s_methodTable[key];<httpHandlers>
  1272. <httpModules>
  1273. <httpModules>
  1274. <httpModules>
  1275. <httpHandlers>
  1276.    
  1277. </httpHandlers>
  1278. </httpModules>
  1279. </httpModules>
  1280. </httpModules>
  1281. </httpHandlers><httpHandlers>
  1282. <httpModules>
  1283. <httpModules>
  1284. <httpModules>
  1285. <httpHandlers>
  1286.    
  1287. </httpHandlers>
  1288. </httpModules>
  1289. </httpModules>
  1290. </httpModules>
  1291. </httpHandlers>if( mi == null ) {<httpHandlers>
  1292. <httpModules>
  1293. <httpModules>
  1294. <httpModules>
  1295. <httpHandlers>
  1296.    
  1297. </httpHandlers>
  1298. </httpModules>
  1299. </httpModules>
  1300. </httpModules>
  1301. </httpHandlers><httpHandlers>
  1302. <httpModules>
  1303. <httpModules>
  1304. <httpModules>
  1305. <httpHandlers>
  1306.    
  1307. </httpHandlers>
  1308. </httpModules>
  1309. </httpModules>
  1310. </httpModules>
  1311. </httpHandlers><httpHandlers>
  1312. <httpModules>
  1313. <httpModules>
  1314. <httpModules>
  1315. <httpHandlers>
  1316.    
  1317. </httpHandlers>
  1318. </httpModules>
  1319. </httpModules>
  1320. </httpModules>
  1321. </httpHandlers>// 注意:这里不考虑方法的重载。<httpHandlers>
  1322. <httpModules>
  1323. <httpModules>
  1324. <httpModules>
  1325. <httpHandlers>
  1326.    
  1327. </httpHandlers>
  1328. </httpModules>
  1329. </httpModules>
  1330. </httpModules>
  1331. </httpHandlers><httpHandlers>
  1332. <httpModules>
  1333. <httpModules>
  1334. <httpModules>
  1335. <httpHandlers>
  1336.    
  1337. </httpHandlers>
  1338. </httpModules>
  1339. </httpModules>
  1340. </httpModules>
  1341. </httpHandlers><httpHandlers>
  1342. <httpModules>
  1343. <httpModules>
  1344. <httpModules>
  1345. <httpHandlers>
  1346.    
  1347. </httpHandlers>
  1348. </httpModules>
  1349. </httpModules>
  1350. </httpModules>
  1351. </httpHandlers>MethodInfo method = type.GetMethod(methodName,<httpHandlers>
  1352. <httpModules>
  1353. <httpModules>
  1354. <httpModules>
  1355. <httpHandlers>
  1356.    
  1357. </httpHandlers>
  1358. </httpModules>
  1359. </httpModules>
  1360. </httpModules>
  1361. </httpHandlers><httpHandlers>
  1362. <httpModules>
  1363. <httpModules>
  1364. <httpModules>
  1365. <httpHandlers>
  1366.    
  1367. </httpHandlers>
  1368. </httpModules>
  1369. </httpModules>
  1370. </httpModules>
  1371. </httpHandlers><httpHandlers>
  1372. <httpModules>
  1373. <httpModules>
  1374. <httpModules>
  1375. <httpHandlers>
  1376.    
  1377. </httpHandlers>
  1378. </httpModules>
  1379. </httpModules>
  1380. </httpModules>
  1381. </httpHandlers><httpHandlers>
  1382. <httpModules>
  1383. <httpModules>
  1384. <httpModules>
  1385. <httpHandlers>
  1386.    
  1387. </httpHandlers>
  1388. </httpModules>
  1389. </httpModules>
  1390. </httpModules>
  1391. </httpHandlers><httpHandlers>
  1392. <httpModules>
  1393. <httpModules>
  1394. <httpModules>
  1395. <httpHandlers>
  1396.    
  1397. </httpHandlers>
  1398. </httpModules>
  1399. </httpModules>
  1400. </httpModules>
  1401. </httpHandlers> BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase);<httpHandlers>
  1402. <httpModules>
  1403. <httpModules>
  1404. <httpModules>
  1405. <httpHandlers>
  1406.    
  1407. </httpHandlers>
  1408. </httpModules>
  1409. </httpModules>
  1410. </httpModules>
  1411. </httpHandlers><httpHandlers>
  1412. <httpModules>
  1413. <httpModules>
  1414. <httpModules>
  1415. <httpHandlers>
  1416.    
  1417. </httpHandlers>
  1418. </httpModules>
  1419. </httpModules>
  1420. </httpModules>
  1421. </httpHandlers><httpHandlers>
  1422. <httpModules>
  1423. <httpModules>
  1424. <httpModules>
  1425. <httpHandlers>
  1426.    
  1427. </httpHandlers>
  1428. </httpModules>
  1429. </httpModules>
  1430. </httpModules>
  1431. </httpHandlers>if( method == null )<httpHandlers>
  1432. <httpModules>
  1433. <httpModules>
  1434. <httpModules>
  1435. <httpHandlers>
  1436.    
  1437. </httpHandlers>
  1438. </httpModules>
  1439. </httpModules>
  1440. </httpModules>
  1441. </httpHandlers><httpHandlers>
  1442. <httpModules>
  1443. <httpModules>
  1444. <httpModules>
  1445. <httpHandlers>
  1446.    
  1447. </httpHandlers>
  1448. </httpModules>
  1449. </httpModules>
  1450. </httpModules>
  1451. </httpHandlers><httpHandlers>
  1452. <httpModules>
  1453. <httpModules>
  1454. <httpModules>
  1455. <httpHandlers>
  1456.    
  1457. </httpHandlers>
  1458. </httpModules>
  1459. </httpModules>
  1460. </httpModules>
  1461. </httpHandlers><httpHandlers>
  1462. <httpModules>
  1463. <httpModules>
  1464. <httpModules>
  1465. <httpHandlers>
  1466.    
  1467. </httpHandlers>
  1468. </httpModules>
  1469. </httpModules>
  1470. </httpModules>
  1471. </httpHandlers>return null;<httpHandlers>
  1472. <httpModules>
  1473. <httpModules>
  1474. <httpModules>
  1475. <httpHandlers>
  1476.    
  1477. </httpHandlers>
  1478. </httpModules>
  1479. </httpModules>
  1480. </httpModules>
  1481. </httpHandlers><httpHandlers>
  1482. <httpModules>
  1483. <httpModules>
  1484. <httpModules>
  1485. <httpHandlers>
  1486.    
  1487. </httpHandlers>
  1488. </httpModules>
  1489. </httpModules>
  1490. </httpModules>
  1491. </httpHandlers><httpHandlers>
  1492. <httpModules>
  1493. <httpModules>
  1494. <httpModules>
  1495. <httpHandlers>
  1496.    
  1497. </httpHandlers>
  1498. </httpModules>
  1499. </httpModules>
  1500. </httpModules>
  1501. </httpHandlers>MyServiceMethodAttribute[] attrs = (MyServiceMethodAttribute[])<httpHandlers>
  1502. <httpModules>
  1503. <httpModules>
  1504. <httpModules>
  1505. <httpHandlers>
  1506.    
  1507. </httpHandlers>
  1508. </httpModules>
  1509. </httpModules>
  1510. </httpModules>
  1511. </httpHandlers><httpHandlers>
  1512. <httpModules>
  1513. <httpModules>
  1514. <httpModules>
  1515. <httpHandlers>
  1516.    
  1517. </httpHandlers>
  1518. </httpModules>
  1519. </httpModules>
  1520. </httpModules>
  1521. </httpHandlers><httpHandlers>
  1522. <httpModules>
  1523. <httpModules>
  1524. <httpModules>
  1525. <httpHandlers>
  1526.    
  1527. </httpHandlers>
  1528. </httpModules>
  1529. </httpModules>
  1530. </httpModules>
  1531. </httpHandlers><httpHandlers>
  1532. <httpModules>
  1533. <httpModules>
  1534. <httpModules>
  1535. <httpHandlers>
  1536.    
  1537. </httpHandlers>
  1538. </httpModules>
  1539. </httpModules>
  1540. </httpModules>
  1541. </httpHandlers><httpHandlers>
  1542. <httpModules>
  1543. <httpModules>
  1544. <httpModules>
  1545. <httpHandlers>
  1546.    
  1547. </httpHandlers>
  1548. </httpModules>
  1549. </httpModules>
  1550. </httpModules>
  1551. </httpHandlers><httpHandlers>
  1552. <httpModules>
  1553. <httpModules>
  1554. <httpModules>
  1555. <httpHandlers>
  1556.    
  1557. </httpHandlers>
  1558. </httpModules>
  1559. </httpModules>
  1560. </httpModules>
  1561. </httpHandlers><httpHandlers>
  1562. <httpModules>
  1563. <httpModules>
  1564. <httpModules>
  1565. <httpHandlers>
  1566.    
  1567. </httpHandlers>
  1568. </httpModules>
  1569. </httpModules>
  1570. </httpModules>
  1571. </httpHandlers><httpHandlers>
  1572. <httpModules>
  1573. <httpModules>
  1574. <httpModules>
  1575. <httpHandlers>
  1576.    
  1577. </httpHandlers>
  1578. </httpModules>
  1579. </httpModules>
  1580. </httpModules>
  1581. </httpHandlers><httpHandlers>
  1582. <httpModules>
  1583. <httpModules>
  1584. <httpModules>
  1585. <httpHandlers>
  1586.    
  1587. </httpHandlers>
  1588. </httpModules>
  1589. </httpModules>
  1590. </httpModules>
  1591. </httpHandlers><httpHandlers>
  1592. <httpModules>
  1593. <httpModules>
  1594. <httpModules>
  1595. <httpHandlers>
  1596.    
  1597. </httpHandlers>
  1598. </httpModules>
  1599. </httpModules>
  1600. </httpModules>
  1601. </httpHandlers>method.GetCustomAttributes(typeof(MyServiceMethodAttribute), false);<httpHandlers>
  1602. <httpModules>
  1603. <httpModules>
  1604. <httpModules>
  1605. <httpHandlers>
  1606.    
  1607. </httpHandlers>
  1608. </httpModules>
  1609. </httpModules>
  1610. </httpModules>
  1611. </httpHandlers><httpHandlers>
  1612. <httpModules>
  1613. <httpModules>
  1614. <httpModules>
  1615. <httpHandlers>
  1616.    
  1617. </httpHandlers>
  1618. </httpModules>
  1619. </httpModules>
  1620. </httpModules>
  1621. </httpHandlers><httpHandlers>
  1622. <httpModules>
  1623. <httpModules>
  1624. <httpModules>
  1625. <httpHandlers>
  1626.    
  1627. </httpHandlers>
  1628. </httpModules>
  1629. </httpModules>
  1630. </httpModules>
  1631. </httpHandlers>if( attrs.Length != 1 )<httpHandlers>
  1632. <httpModules>
  1633. <httpModules>
  1634. <httpModules>
  1635. <httpHandlers>
  1636.    
  1637. </httpHandlers>
  1638. </httpModules>
  1639. </httpModules>
  1640. </httpModules>
  1641. </httpHandlers><httpHandlers>
  1642. <httpModules>
  1643. <httpModules>
  1644. <httpModules>
  1645. <httpHandlers>
  1646.    
  1647. </httpHandlers>
  1648. </httpModules>
  1649. </httpModules>
  1650. </httpModules>
  1651. </httpHandlers><httpHandlers>
  1652. <httpModules>
  1653. <httpModules>
  1654. <httpModules>
  1655. <httpHandlers>
  1656.    
  1657. </httpHandlers>
  1658. </httpModules>
  1659. </httpModules>
  1660. </httpModules>
  1661. </httpHandlers><httpHandlers>
  1662. <httpModules>
  1663. <httpModules>
  1664. <httpModules>
  1665. <httpHandlers>
  1666.    
  1667. </httpHandlers>
  1668. </httpModules>
  1669. </httpModules>
  1670. </httpModules>
  1671. </httpHandlers>return null;<httpHandlers>
  1672. <httpModules>
  1673. <httpModules>
  1674. <httpModules>
  1675. <httpHandlers>
  1676.    
  1677. </httpHandlers>
  1678. </httpModules>
  1679. </httpModules>
  1680. </httpModules>
  1681. </httpHandlers><httpHandlers>
  1682. <httpModules>
  1683. <httpModules>
  1684. <httpModules>
  1685. <httpHandlers>
  1686.    
  1687. </httpHandlers>
  1688. </httpModules>
  1689. </httpModules>
  1690. </httpModules>
  1691. </httpHandlers><httpHandlers>
  1692. <httpModules>
  1693. <httpModules>
  1694. <httpModules>
  1695. <httpHandlers>
  1696.    
  1697. </httpHandlers>
  1698. </httpModules>
  1699. </httpModules>
  1700. </httpModules>
  1701. </httpHandlers>// 由于服务方法的参数来源于反序列化,此时只可能包含一个参数。<httpHandlers>
  1702. <httpModules>
  1703. <httpModules>
  1704. <httpModules>
  1705. <httpHandlers>
  1706.    
  1707. </httpHandlers>
  1708. </httpModules>
  1709. </httpModules>
  1710. </httpModules>
  1711. </httpHandlers><httpHandlers>
  1712. <httpModules>
  1713. <httpModules>
  1714. <httpModules>
  1715. <httpHandlers>
  1716.    
  1717. </httpHandlers>
  1718. </httpModules>
  1719. </httpModules>
  1720. </httpModules>
  1721. </httpHandlers><httpHandlers>
  1722. <httpModules>
  1723. <httpModules>
  1724. <httpModules>
  1725. <httpHandlers>
  1726.    
  1727. </httpHandlers>
  1728. </httpModules>
  1729. </httpModules>
  1730. </httpModules>
  1731. </httpHandlers>ParameterInfo[] paraInfos = method.GetParameters();<httpHandlers>
  1732. <httpModules>
  1733. <httpModules>
  1734. <httpModules>
  1735. <httpHandlers>
  1736.    
  1737. </httpHandlers>
  1738. </httpModules>
  1739. </httpModules>
  1740. </httpModules>
  1741. </httpHandlers><httpHandlers>
  1742. <httpModules>
  1743. <httpModules>
  1744. <httpModules>
  1745. <httpHandlers>
  1746.    
  1747. </httpHandlers>
  1748. </httpModules>
  1749. </httpModules>
  1750. </httpModules>
  1751. </httpHandlers><httpHandlers>
  1752. <httpModules>
  1753. <httpModules>
  1754. <httpModules>
  1755. <httpHandlers>
  1756.    
  1757. </httpHandlers>
  1758. </httpModules>
  1759. </httpModules>
  1760. </httpModules>
  1761. </httpHandlers>if( paraInfos.Length != 1 )<httpHandlers>
  1762. <httpModules>
  1763. <httpModules>
  1764. <httpModules>
  1765. <httpHandlers>
  1766.    
  1767. </httpHandlers>
  1768. </httpModules>
  1769. </httpModules>
  1770. </httpModules>
  1771. </httpHandlers><httpHandlers>
  1772. <httpModules>
  1773. <httpModules>
  1774. <httpModules>
  1775. <httpHandlers>
  1776.    
  1777. </httpHandlers>
  1778. </httpModules>
  1779. </httpModules>
  1780. </httpModules>
  1781. </httpHandlers><httpHandlers>
  1782. <httpModules>
  1783. <httpModules>
  1784. <httpModules>
  1785. <httpHandlers>
  1786.    
  1787. </httpHandlers>
  1788. </httpModules>
  1789. </httpModules>
  1790. </httpModules>
  1791. </httpHandlers><httpHandlers>
  1792. <httpModules>
  1793. <httpModules>
  1794. <httpModules>
  1795. <httpHandlers>
  1796.    
  1797. </httpHandlers>
  1798. </httpModules>
  1799. </httpModules>
  1800. </httpModules>
  1801. </httpHandlers>throw new ArgumentNullException("指定的方法虽找到,但该方法的参数数量不是1");<httpHandlers>
  1802. <httpModules>
  1803. <httpModules>
  1804. <httpModules>
  1805. <httpHandlers>
  1806.    
  1807. </httpHandlers>
  1808. </httpModules>
  1809. </httpModules>
  1810. </httpModules>
  1811. </httpHandlers><httpHandlers>
  1812. <httpModules>
  1813. <httpModules>
  1814. <httpModules>
  1815. <httpHandlers>
  1816.    
  1817. </httpHandlers>
  1818. </httpModules>
  1819. </httpModules>
  1820. </httpModules>
  1821. </httpHandlers><httpHandlers>
  1822. <httpModules>
  1823. <httpModules>
  1824. <httpModules>
  1825. <httpHandlers>
  1826.    
  1827. </httpHandlers>
  1828. </httpModules>
  1829. </httpModules>
  1830. </httpModules>
  1831. </httpHandlers>AuthorizeAttribute[] auths = (AuthorizeAttribute[])method.GetCustomAttributes(typeof(AuthorizeAttribute), false);<httpHandlers>
  1832. <httpModules>
  1833. <httpModules>
  1834. <httpModules>
  1835. <httpHandlers>
  1836.    
  1837. </httpHandlers>
  1838. </httpModules>
  1839. </httpModules>
  1840. </httpModules>
  1841. </httpHandlers><httpHandlers>
  1842. <httpModules>
  1843. <httpModules>
  1844. <httpModules>
  1845. <httpHandlers>
  1846.    
  1847. </httpHandlers>
  1848. </httpModules>
  1849. </httpModules>
  1850. </httpModules>
  1851. </httpHandlers><httpHandlers>
  1852. <httpModules>
  1853. <httpModules>
  1854. <httpModules>
  1855. <httpHandlers>
  1856.    
  1857. </httpHandlers>
  1858. </httpModules>
  1859. </httpModules>
  1860. </httpModules>
  1861. </httpHandlers>mi = new MethodAndAttrInfo {<httpHandlers>
  1862. <httpModules>
  1863. <httpModules>
  1864. <httpModules>
  1865. <httpHandlers>
  1866.    
  1867. </httpHandlers>
  1868. </httpModules>
  1869. </httpModules>
  1870. </httpModules>
  1871. </httpHandlers><httpHandlers>
  1872. <httpModules>
  1873. <httpModules>
  1874. <httpModules>
  1875. <httpHandlers>
  1876.    
  1877. </httpHandlers>
  1878. </httpModules>
  1879. </httpModules>
  1880. </httpModules>
  1881. </httpHandlers><httpHandlers>
  1882. <httpModules>
  1883. <httpModules>
  1884. <httpModules>
  1885. <httpHandlers>
  1886.    
  1887. </httpHandlers>
  1888. </httpModules>
  1889. </httpModules>
  1890. </httpModules>
  1891. </httpHandlers><httpHandlers>
  1892. <httpModules>
  1893. <httpModules>
  1894. <httpModules>
  1895. <httpHandlers>
  1896.    
  1897. </httpHandlers>
  1898. </httpModules>
  1899. </httpModules>
  1900. </httpModules>
  1901. </httpHandlers><httpHandlers>
  1902. <httpModules>
  1903. <httpModules>
  1904. <httpModules>
  1905. <httpHandlers>
  1906.    
  1907. </httpHandlers>
  1908. </httpModules>
  1909. </httpModules>
  1910. </httpModules>
  1911. </httpHandlers><httpHandlers>
  1912. <httpModules>
  1913. <httpModules>
  1914. <httpModules>
  1915. <httpHandlers>
  1916.    
  1917. </httpHandlers>
  1918. </httpModules>
  1919. </httpModules>
  1920. </httpModules>
  1921. </httpHandlers>MethodInfo = method,<httpHandlers>
  1922. <httpModules>
  1923. <httpModules>
  1924. <httpModules>
  1925. <httpHandlers>
  1926.    
  1927. </httpHandlers>
  1928. </httpModules>
  1929. </httpModules>
  1930. </httpModules>
  1931. </httpHandlers><httpHandlers>
  1932. <httpModules>
  1933. <httpModules>
  1934. <httpModules>
  1935. <httpHandlers>
  1936.    
  1937. </httpHandlers>
  1938. </httpModules>
  1939. </httpModules>
  1940. </httpModules>
  1941. </httpHandlers><httpHandlers>
  1942. <httpModules>
  1943. <httpModules>
  1944. <httpModules>
  1945. <httpHandlers>
  1946.    
  1947. </httpHandlers>
  1948. </httpModules>
  1949. </httpModules>
  1950. </httpModules>
  1951. </httpHandlers><httpHandlers>
  1952. <httpModules>
  1953. <httpModules>
  1954. <httpModules>
  1955. <httpHandlers>
  1956.    
  1957. </httpHandlers>
  1958. </httpModules>
  1959. </httpModules>
  1960. </httpModules>
  1961. </httpHandlers><httpHandlers>
  1962. <httpModules>
  1963. <httpModules>
  1964. <httpModules>
  1965. <httpHandlers>
  1966.    
  1967. </httpHandlers>
  1968. </httpModules>
  1969. </httpModules>
  1970. </httpModules>
  1971. </httpHandlers><httpHandlers>
  1972. <httpModules>
  1973. <httpModules>
  1974. <httpModules>
  1975. <httpHandlers>
  1976.    
  1977. </httpHandlers>
  1978. </httpModules>
  1979. </httpModules>
  1980. </httpModules>
  1981. </httpHandlers>ParamType = paraInfos[0].ParameterType,<httpHandlers>
  1982. <httpModules>
  1983. <httpModules>
  1984. <httpModules>
  1985. <httpHandlers>
  1986.    
  1987. </httpHandlers>
  1988. </httpModules>
  1989. </httpModules>
  1990. </httpModules>
  1991. </httpHandlers><httpHandlers>
  1992. <httpModules>
  1993. <httpModules>
  1994. <httpModules>
  1995. <httpHandlers>
  1996.    
  1997. </httpHandlers>
  1998. </httpModules>
  1999. </httpModules>
  2000. </httpModules>
  2001. </httpHandlers><httpHandlers>
  2002. <httpModules>
  2003. <httpModules>
  2004. <httpModules>
  2005. <httpHandlers>
  2006.    
  2007. </httpHandlers>
  2008. </httpModules>
  2009. </httpModules>
  2010. </httpModules>
  2011. </httpHandlers><httpHandlers>
  2012. <httpModules>
  2013. <httpModules>
  2014. <httpModules>
  2015. <httpHandlers>
  2016.    
  2017. </httpHandlers>
  2018. </httpModules>
  2019. </httpModules>
  2020. </httpModules>
  2021. </httpHandlers><httpHandlers>
  2022. <httpModules>
  2023. <httpModules>
  2024. <httpModules>
  2025. <httpHandlers>
  2026.    
  2027. </httpHandlers>
  2028. </httpModules>
  2029. </httpModules>
  2030. </httpModules>
  2031. </httpHandlers><httpHandlers>
  2032. <httpModules>
  2033. <httpModules>
  2034. <httpModules>
  2035. <httpHandlers>
  2036.    
  2037. </httpHandlers>
  2038. </httpModules>
  2039. </httpModules>
  2040. </httpModules>
  2041. </httpHandlers>Attr = attrs[0],<httpHandlers>
  2042. <httpModules>
  2043. <httpModules>
  2044. <httpModules>
  2045. <httpHandlers>
  2046.    
  2047. </httpHandlers>
  2048. </httpModules>
  2049. </httpModules>
  2050. </httpModules>
  2051. </httpHandlers><httpHandlers>
  2052. <httpModules>
  2053. <httpModules>
  2054. <httpModules>
  2055. <httpHandlers>
  2056.    
  2057. </httpHandlers>
  2058. </httpModules>
  2059. </httpModules>
  2060. </httpModules>
  2061. </httpHandlers><httpHandlers>
  2062. <httpModules>
  2063. <httpModules>
  2064. <httpModules>
  2065. <httpHandlers>
  2066.    
  2067. </httpHandlers>
  2068. </httpModules>
  2069. </httpModules>
  2070. </httpModules>
  2071. </httpHandlers><httpHandlers>
  2072. <httpModules>
  2073. <httpModules>
  2074. <httpModules>
  2075. <httpHandlers>
  2076.    
  2077. </httpHandlers>
  2078. </httpModules>
  2079. </httpModules>
  2080. </httpModules>
  2081. </httpHandlers><httpHandlers>
  2082. <httpModules>
  2083. <httpModules>
  2084. <httpModules>
  2085. <httpHandlers>
  2086.    
  2087. </httpHandlers>
  2088. </httpModules>
  2089. </httpModules>
  2090. </httpModules>
  2091. </httpHandlers><httpHandlers>
  2092. <httpModules>
  2093. <httpModules>
  2094. <httpModules>
  2095. <httpHandlers>
  2096.    
  2097. </httpHandlers>
  2098. </httpModules>
  2099. </httpModules>
  2100. </httpModules>
  2101. </httpHandlers>AuthorizeAttr = (auths.Length > 0 ? auths[0] : null)<httpHandlers>
  2102. <httpModules>
  2103. <httpModules>
  2104. <httpModules>
  2105. <httpHandlers>
  2106.    
  2107. </httpHandlers>
  2108. </httpModules>
  2109. </httpModules>
  2110. </httpModules>
  2111. </httpHandlers><httpHandlers>
  2112. <httpModules>
  2113. <httpModules>
  2114. <httpModules>
  2115. <httpHandlers>
  2116.    
  2117. </httpHandlers>
  2118. </httpModules>
  2119. </httpModules>
  2120. </httpModules>
  2121. </httpHandlers><httpHandlers>
  2122. <httpModules>
  2123. <httpModules>
  2124. <httpModules>
  2125. <httpHandlers>
  2126.    
  2127. </httpHandlers>
  2128. </httpModules>
  2129. </httpModules>
  2130. </httpModules>
  2131. </httpHandlers>};<httpHandlers>
  2132. <httpModules>
  2133. <httpModules>
  2134. <httpModules>
  2135. <httpHandlers>
  2136.    
  2137. </httpHandlers>
  2138. </httpModules>
  2139. </httpModules>
  2140. </httpModules>
  2141. </httpHandlers><httpHandlers>
  2142. <httpModules>
  2143. <httpModules>
  2144. <httpModules>
  2145. <httpHandlers>
  2146.    
  2147. </httpHandlers>
  2148. </httpModules>
  2149. </httpModules>
  2150. </httpModules>
  2151. </httpHandlers><httpHandlers>
  2152. <httpModules>
  2153. <httpModules>
  2154. <httpModules>
  2155. <httpHandlers>
  2156.    
  2157. </httpHandlers>
  2158. </httpModules>
  2159. </httpModules>
  2160. </httpModules>
  2161. </httpHandlers>s_methodTable[key] = mi;<httpHandlers>
  2162. <httpModules>
  2163. <httpModules>
  2164. <httpModules>
  2165. <httpHandlers>
  2166.    
  2167. </httpHandlers>
  2168. </httpModules>
  2169. </httpModules>
  2170. </httpModules>
  2171. </httpHandlers><httpHandlers>
  2172. <httpModules>
  2173. <httpModules>
  2174. <httpModules>
  2175. <httpHandlers>
  2176.    
  2177. </httpHandlers>
  2178. </httpModules>
  2179. </httpModules>
  2180. </httpModules>
  2181. </httpHandlers>}<httpHandlers>
  2182. <httpModules>
  2183. <httpModules>
  2184. <httpModules>
  2185. <httpHandlers>
  2186.    
  2187. </httpHandlers>
  2188. </httpModules>
  2189. </httpModules>
  2190. </httpModules>
  2191. </httpHandlers><httpHandlers>
  2192. <httpModules>
  2193. <httpModules>
  2194. <httpModules>
  2195. <httpHandlers>
  2196.    
  2197. </httpHandlers>
  2198. </httpModules>
  2199. </httpModules>
  2200. </httpModules>
  2201. </httpHandlers>return mi;<httpHandlers>
  2202. <httpModules>
  2203. <httpModules>
  2204. <httpModules>
  2205. <httpHandlers>
  2206.    
  2207. </httpHandlers>
  2208. </httpModules>
  2209. </httpModules>
  2210. </httpModules>
  2211. </httpHandlers><httpHandlers>
  2212. <httpModules>
  2213. <httpModules>
  2214. <httpModules>
  2215. <httpHandlers>
  2216.    
  2217. </httpHandlers>
  2218. </httpModules>
  2219. </httpModules>
  2220. </httpModules>
  2221. </httpHandlers><httpHandlers>
  2222. <httpModules>
  2223. <httpModules>
  2224. <httpModules>
  2225. <httpHandlers>
  2226.    
  2227. </httpHandlers>
  2228. </httpModules>
  2229. </httpModules>
  2230. </httpModules>
  2231. </httpHandlers><httpHandlers>
  2232. <httpModules>
  2233. <httpModules>
  2234. <httpModules>
  2235. <httpHandlers>
  2236.    
  2237. </httpHandlers>
  2238. </httpModules>
  2239. </httpModules>
  2240. </httpModules>
  2241. </httpHandlers>}<httpHandlers>
  2242. <httpModules>
  2243. <httpModules>
  2244. <httpModules>
  2245. <httpHandlers>
  2246.    
  2247. </httpHandlers>
  2248. </httpModules>
  2249. </httpModules>
  2250. </httpModules>
  2251. </httpHandlers>///<httpHandlers>
  2252. <httpModules>
  2253. <httpModules>
  2254. <httpModules>
  2255. <httpHandlers>
  2256.    
  2257. </httpHandlers>
  2258. </httpModules>
  2259. </httpModules>
  2260. </httpModules>
  2261. </httpHandlers> /// 根据类型名称以及方法名称返回要调用的相关信息<httpHandlers>
  2262. <httpModules>
  2263. <httpModules>
  2264. <httpModules>
  2265. <httpHandlers>
  2266.    
  2267. </httpHandlers>
  2268. </httpModules>
  2269. </httpModules>
  2270. </httpModules>
  2271. </httpHandlers>///<httpHandlers>
  2272. <httpModules>
  2273. <httpModules>
  2274. <httpModules>
  2275. <httpHandlers>
  2276.    
  2277. </httpHandlers>
  2278. </httpModules>
  2279. </httpModules>
  2280. </httpModules>
  2281. </httpHandlers> /// 包含类型名称以及方法名称的对象<httpHandlers>
  2282. <httpModules>
  2283. <httpModules>
  2284. <httpModules>
  2285. <httpHandlers>
  2286.    
  2287. </httpHandlers>
  2288. </httpModules>
  2289. </httpModules>
  2290. </httpModules>
  2291. </httpHandlers>///<httpHandlers>
  2292. <httpModules>
  2293. <httpModules>
  2294. <httpModules>
  2295. <httpHandlers>
  2296.    
  2297. </httpHandlers>
  2298. </httpModules>
  2299. </httpModules>
  2300. </httpModules>
  2301. </httpHandlers> public static InvokeInfo GetInvokeInfo(NamesPair pair)<httpHandlers>
  2302. <httpModules>
  2303. <httpModules>
  2304. <httpModules>
  2305. <httpHandlers>
  2306.    
  2307. </httpHandlers>
  2308. </httpModules>
  2309. </httpModules>
  2310. </httpModules>
  2311. </httpHandlers>{<httpHandlers>
  2312. <httpModules>
  2313. <httpModules>
  2314. <httpModules>
  2315. <httpHandlers>
  2316.    
  2317. </httpHandlers>
  2318. </httpModules>
  2319. </httpModules>
  2320. </httpModules>
  2321. </httpHandlers><httpHandlers>
  2322. <httpModules>
  2323. <httpModules>
  2324. <httpModules>
  2325. <httpHandlers>
  2326.    
  2327. </httpHandlers>
  2328. </httpModules>
  2329. </httpModules>
  2330. </httpModules>
  2331. </httpHandlers>if( pair == null )<httpHandlers>
  2332. <httpModules>
  2333. <httpModules>
  2334. <httpModules>
  2335. <httpHandlers>
  2336.    
  2337. </httpHandlers>
  2338. </httpModules>
  2339. </httpModules>
  2340. </httpModules>
  2341. </httpHandlers><httpHandlers>
  2342. <httpModules>
  2343. <httpModules>
  2344. <httpModules>
  2345. <httpHandlers>
  2346.    
  2347. </httpHandlers>
  2348. </httpModules>
  2349. </httpModules>
  2350. </httpModules>
  2351. </httpHandlers><httpHandlers>
  2352. <httpModules>
  2353. <httpModules>
  2354. <httpModules>
  2355. <httpHandlers>
  2356.    
  2357. </httpHandlers>
  2358. </httpModules>
  2359. </httpModules>
  2360. </httpModules>
  2361. </httpHandlers>throw new ArgumentNullException("pair");<httpHandlers>
  2362. <httpModules>
  2363. <httpModules>
  2364. <httpModules>
  2365. <httpHandlers>
  2366.    
  2367. </httpHandlers>
  2368. </httpModules>
  2369. </httpModules>
  2370. </httpModules>
  2371. </httpHandlers><httpHandlers>
  2372. <httpModules>
  2373. <httpModules>
  2374. <httpModules>
  2375. <httpHandlers>
  2376.    
  2377. </httpHandlers>
  2378. </httpModules>
  2379. </httpModules>
  2380. </httpModules>
  2381. </httpHandlers>InvokeInfo vkInfo = new InvokeInfo();<httpHandlers>
  2382. <httpModules>
  2383. <httpModules>
  2384. <httpModules>
  2385. <httpHandlers>
  2386.    
  2387. </httpHandlers>
  2388. </httpModules>
  2389. </httpModules>
  2390. </httpModules>
  2391. </httpHandlers><httpHandlers>
  2392. <httpModules>
  2393. <httpModules>
  2394. <httpModules>
  2395. <httpHandlers>
  2396.    
  2397. </httpHandlers>
  2398. </httpModules>
  2399. </httpModules>
  2400. </httpModules>
  2401. </httpHandlers>vkInfo.ServiceTypeInfo = GetServiceType(pair.ServiceName);<httpHandlers>
  2402. <httpModules>
  2403. <httpModules>
  2404. <httpModules>
  2405. <httpHandlers>
  2406.    
  2407. </httpHandlers>
  2408. </httpModules>
  2409. </httpModules>
  2410. </httpModules>
  2411. </httpHandlers><httpHandlers>
  2412. <httpModules>
  2413. <httpModules>
  2414. <httpModules>
  2415. <httpHandlers>
  2416.    
  2417. </httpHandlers>
  2418. </httpModules>
  2419. </httpModules>
  2420. </httpModules>
  2421. </httpHandlers>if( vkInfo.ServiceTypeInfo == null )<httpHandlers>
  2422. <httpModules>
  2423. <httpModules>
  2424. <httpModules>
  2425. <httpHandlers>
  2426.    
  2427. </httpHandlers>
  2428. </httpModules>
  2429. </httpModules>
  2430. </httpModules>
  2431. </httpHandlers><httpHandlers>
  2432. <httpModules>
  2433. <httpModules>
  2434. <httpModules>
  2435. <httpHandlers>
  2436.    
  2437. </httpHandlers>
  2438. </httpModules>
  2439. </httpModules>
  2440. </httpModules>
  2441. </httpHandlers><httpHandlers>
  2442. <httpModules>
  2443. <httpModules>
  2444. <httpModules>
  2445. <httpHandlers>
  2446.    
  2447. </httpHandlers>
  2448. </httpModules>
  2449. </httpModules>
  2450. </httpModules>
  2451. </httpHandlers>return null;<httpHandlers>
  2452. <httpModules>
  2453. <httpModules>
  2454. <httpModules>
  2455. <httpHandlers>
  2456.    
  2457. </httpHandlers>
  2458. </httpModules>
  2459. </httpModules>
  2460. </httpModules>
  2461. </httpHandlers><httpHandlers>
  2462. <httpModules>
  2463. <httpModules>
  2464. <httpModules>
  2465. <httpHandlers>
  2466.    
  2467. </httpHandlers>
  2468. </httpModules>
  2469. </httpModules>
  2470. </httpModules>
  2471. </httpHandlers>vkInfo.MethodAttrInfo = GetServiceMethod(vkInfo.ServiceTypeInfo.ServiceType, pair.MethodName);<httpHandlers>
  2472. <httpModules>
  2473. <httpModules>
  2474. <httpModules>
  2475. <httpHandlers>
  2476.    
  2477. </httpHandlers>
  2478. </httpModules>
  2479. </httpModules>
  2480. </httpModules>
  2481. </httpHandlers><httpHandlers>
  2482. <httpModules>
  2483. <httpModules>
  2484. <httpModules>
  2485. <httpHandlers>
  2486.    
  2487. </httpHandlers>
  2488. </httpModules>
  2489. </httpModules>
  2490. </httpModules>
  2491. </httpHandlers>if( vkInfo.MethodAttrInfo == null )<httpHandlers>
  2492. <httpModules>
  2493. <httpModules>
  2494. <httpModules>
  2495. <httpHandlers>
  2496.    
  2497. </httpHandlers>
  2498. </httpModules>
  2499. </httpModules>
  2500. </httpModules>
  2501. </httpHandlers><httpHandlers>
  2502. <httpModules>
  2503. <httpModules>
  2504. <httpModules>
  2505. <httpHandlers>
  2506.    
  2507. </httpHandlers>
  2508. </httpModules>
  2509. </httpModules>
  2510. </httpModules>
  2511. </httpHandlers><httpHandlers>
  2512. <httpModules>
  2513. <httpModules>
  2514. <httpModules>
  2515. <httpHandlers>
  2516.    
  2517. </httpHandlers>
  2518. </httpModules>
  2519. </httpModules>
  2520. </httpModules>
  2521. </httpHandlers>return null;<httpHandlers>
  2522. <httpModules>
  2523. <httpModules>
  2524. <httpModules>
  2525. <httpHandlers>
  2526.    
  2527. </httpHandlers>
  2528. </httpModules>
  2529. </httpModules>
  2530. </httpModules>
  2531. </httpHandlers><httpHandlers>
  2532. <httpModules>
  2533. <httpModules>
  2534. <httpModules>
  2535. <httpHandlers>
  2536.    
  2537. </httpHandlers>
  2538. </httpModules>
  2539. </httpModules>
  2540. </httpModules>
  2541. </httpHandlers>if( vkInfo.MethodAttrInfo.MethodInfo.IsStatic == false )<httpHandlers>
  2542. <httpModules>
  2543. <httpModules>
  2544. <httpModules>
  2545. <httpHandlers>
  2546.    
  2547. </httpHandlers>
  2548. </httpModules>
  2549. </httpModules>
  2550. </httpModules>
  2551. </httpHandlers><httpHandlers>
  2552. <httpModules>
  2553. <httpModules>
  2554. <httpModules>
  2555. <httpHandlers>
  2556.    
  2557. </httpHandlers>
  2558. </httpModules>
  2559. </httpModules>
  2560. </httpModules>
  2561. </httpHandlers><httpHandlers>
  2562. <httpModules>
  2563. <httpModules>
  2564. <httpModules>
  2565. <httpHandlers>
  2566.    
  2567. </httpHandlers>
  2568. </httpModules>
  2569. </httpModules>
  2570. </httpModules>
  2571. </httpHandlers>vkInfo.ServiceInstance = Activator.CreateInstance(vkInfo.ServiceTypeInfo.ServiceType);<httpHandlers>
  2572. <httpModules>
  2573. <httpModules>
  2574. <httpModules>
  2575. <httpHandlers>
  2576.    
  2577. </httpHandlers>
  2578. </httpModules>
  2579. </httpModules>
  2580. </httpModules>
  2581. </httpHandlers><httpHandlers>
  2582. <httpModules>
  2583. <httpModules>
  2584. <httpModules>
  2585. <httpHandlers>
  2586.    
  2587. </httpHandlers>
  2588. </httpModules>
  2589. </httpModules>
  2590. </httpModules>
  2591. </httpHandlers>return vkInfo;<httpHandlers>
  2592. <httpModules>
  2593. <httpModules>
  2594. <httpModules>
  2595. <httpHandlers>
  2596.    
  2597. </httpHandlers>
  2598. </httpModules>
  2599. </httpModules>
  2600. </httpModules>
  2601. </httpHandlers>}}
复制代码
ServiceExecutor用于调用服务方法,前面所说的5种服务发布方式,最终都要经过这里。
  1. /// /// 最终调用服务方法的工具类。/// public static class ServiceExecutor{<httpHandlers>
  2. <httpModules>
  3. <httpModules>
  4. <httpModules>
  5. <httpHandlers>
  6.    
  7. </httpHandlers>
  8. </httpModules>
  9. </httpModules>
  10. </httpModules>
  11. </httpHandlers>internal static void ProcessRequest(HttpContext context, ServiceInfo info)<httpHandlers>
  12. <httpModules>
  13. <httpModules>
  14. <httpModules>
  15. <httpHandlers>
  16.    
  17. </httpHandlers>
  18. </httpModules>
  19. </httpModules>
  20. </httpModules>
  21. </httpHandlers>{<httpHandlers>
  22. <httpModules>
  23. <httpModules>
  24. <httpModules>
  25. <httpHandlers>
  26.    
  27. </httpHandlers>
  28. </httpModules>
  29. </httpModules>
  30. </httpModules>
  31. </httpHandlers><httpHandlers>
  32. <httpModules>
  33. <httpModules>
  34. <httpModules>
  35. <httpHandlers>
  36.    
  37. </httpHandlers>
  38. </httpModules>
  39. </httpModules>
  40. </httpModules>
  41. </httpHandlers>if( context == null )<httpHandlers>
  42. <httpModules>
  43. <httpModules>
  44. <httpModules>
  45. <httpHandlers>
  46.    
  47. </httpHandlers>
  48. </httpModules>
  49. </httpModules>
  50. </httpModules>
  51. </httpHandlers><httpHandlers>
  52. <httpModules>
  53. <httpModules>
  54. <httpModules>
  55. <httpHandlers>
  56.    
  57. </httpHandlers>
  58. </httpModules>
  59. </httpModules>
  60. </httpModules>
  61. </httpHandlers><httpHandlers>
  62. <httpModules>
  63. <httpModules>
  64. <httpModules>
  65. <httpHandlers>
  66.    
  67. </httpHandlers>
  68. </httpModules>
  69. </httpModules>
  70. </httpModules>
  71. </httpHandlers>throw new ArgumentNullException("context");<httpHandlers>
  72. <httpModules>
  73. <httpModules>
  74. <httpModules>
  75. <httpHandlers>
  76.    
  77. </httpHandlers>
  78. </httpModules>
  79. </httpModules>
  80. </httpModules>
  81. </httpHandlers><httpHandlers>
  82. <httpModules>
  83. <httpModules>
  84. <httpModules>
  85. <httpHandlers>
  86.    
  87. </httpHandlers>
  88. </httpModules>
  89. </httpModules>
  90. </httpModules>
  91. </httpHandlers>if( info == null || info.InvokeInfo == null )<httpHandlers>
  92. <httpModules>
  93. <httpModules>
  94. <httpModules>
  95. <httpHandlers>
  96.    
  97. </httpHandlers>
  98. </httpModules>
  99. </httpModules>
  100. </httpModules>
  101. </httpHandlers><httpHandlers>
  102. <httpModules>
  103. <httpModules>
  104. <httpModules>
  105. <httpHandlers>
  106.    
  107. </httpHandlers>
  108. </httpModules>
  109. </httpModules>
  110. </httpModules>
  111. </httpHandlers><httpHandlers>
  112. <httpModules>
  113. <httpModules>
  114. <httpModules>
  115. <httpHandlers>
  116.    
  117. </httpHandlers>
  118. </httpModules>
  119. </httpModules>
  120. </httpModules>
  121. </httpHandlers>throw new ArgumentNullException("info");<httpHandlers>
  122. <httpModules>
  123. <httpModules>
  124. <httpModules>
  125. <httpHandlers>
  126.    
  127. </httpHandlers>
  128. </httpModules>
  129. </httpModules>
  130. </httpModules>
  131. </httpHandlers><httpHandlers>
  132. <httpModules>
  133. <httpModules>
  134. <httpModules>
  135. <httpHandlers>
  136.    
  137. </httpHandlers>
  138. </httpModules>
  139. </httpModules>
  140. </httpModules>
  141. </httpHandlers>//if( context.Request.InputStream.Length == 0 )<httpHandlers>
  142. <httpModules>
  143. <httpModules>
  144. <httpModules>
  145. <httpHandlers>
  146.    
  147. </httpHandlers>
  148. </httpModules>
  149. </httpModules>
  150. </httpModules>
  151. </httpHandlers><httpHandlers>
  152. <httpModules>
  153. <httpModules>
  154. <httpModules>
  155. <httpHandlers>
  156.    
  157. </httpHandlers>
  158. </httpModules>
  159. </httpModules>
  160. </httpModules>
  161. </httpHandlers>//<httpHandlers>
  162. <httpModules>
  163. <httpModules>
  164. <httpModules>
  165. <httpHandlers>
  166.    
  167. </httpHandlers>
  168. </httpModules>
  169. </httpModules>
  170. </httpModules>
  171. </httpHandlers>throw new InvalidDataException("没有调用数据,请将调用数据以请求体的方式传入。");<httpHandlers>
  172. <httpModules>
  173. <httpModules>
  174. <httpModules>
  175. <httpHandlers>
  176.    
  177. </httpHandlers>
  178. </httpModules>
  179. </httpModules>
  180. </httpModules>
  181. </httpHandlers><httpHandlers>
  182. <httpModules>
  183. <httpModules>
  184. <httpModules>
  185. <httpHandlers>
  186.    
  187. </httpHandlers>
  188. </httpModules>
  189. </httpModules>
  190. </httpModules>
  191. </httpHandlers><httpHandlers>
  192. <httpModules>
  193. <httpModules>
  194. <httpModules>
  195. <httpHandlers>
  196.    
  197. </httpHandlers>
  198. </httpModules>
  199. </httpModules>
  200. </httpModules>
  201. </httpHandlers><httpHandlers>
  202. <httpModules>
  203. <httpModules>
  204. <httpModules>
  205. <httpHandlers>
  206.    
  207. </httpHandlers>
  208. </httpModules>
  209. </httpModules>
  210. </httpModules>
  211. </httpHandlers>if( info.InvokeInfo.AuthenticateRequest(context) == false )<httpHandlers>
  212. <httpModules>
  213. <httpModules>
  214. <httpModules>
  215. <httpHandlers>
  216.    
  217. </httpHandlers>
  218. </httpModules>
  219. </httpModules>
  220. </httpModules>
  221. </httpHandlers><httpHandlers>
  222. <httpModules>
  223. <httpModules>
  224. <httpModules>
  225. <httpHandlers>
  226.    
  227. </httpHandlers>
  228. </httpModules>
  229. </httpModules>
  230. </httpModules>
  231. </httpHandlers><httpHandlers>
  232. <httpModules>
  233. <httpModules>
  234. <httpModules>
  235. <httpHandlers>
  236.    
  237. </httpHandlers>
  238. </httpModules>
  239. </httpModules>
  240. </httpModules>
  241. </httpHandlers>ExceptionHelper.Throw403Exception(context);<httpHandlers>
  242. <httpModules>
  243. <httpModules>
  244. <httpModules>
  245. <httpHandlers>
  246.    
  247. </httpHandlers>
  248. </httpModules>
  249. </httpModules>
  250. </httpModules>
  251. </httpHandlers><httpHandlers>
  252. <httpModules>
  253. <httpModules>
  254. <httpModules>
  255. <httpHandlers>
  256.    
  257. </httpHandlers>
  258. </httpModules>
  259. </httpModules>
  260. </httpModules>
  261. </httpHandlers><httpHandlers>
  262. <httpModules>
  263. <httpModules>
  264. <httpModules>
  265. <httpHandlers>
  266.    
  267. </httpHandlers>
  268. </httpModules>
  269. </httpModules>
  270. </httpModules>
  271. </httpHandlers><httpHandlers>
  272. <httpModules>
  273. <httpModules>
  274. <httpModules>
  275. <httpHandlers>
  276.    
  277. </httpHandlers>
  278. </httpModules>
  279. </httpModules>
  280. </httpModules>
  281. </httpHandlers>// 获取客户端的数据序列化格式。<httpHandlers>
  282. <httpModules>
  283. <httpModules>
  284. <httpModules>
  285. <httpHandlers>
  286.    
  287. </httpHandlers>
  288. </httpModules>
  289. </httpModules>
  290. </httpModules>
  291. </httpHandlers><httpHandlers>
  292. <httpModules>
  293. <httpModules>
  294. <httpModules>
  295. <httpHandlers>
  296.    
  297. </httpHandlers>
  298. </httpModules>
  299. </httpModules>
  300. </httpModules>
  301. </httpHandlers><httpHandlers>
  302. <httpModules>
  303. <httpModules>
  304. <httpModules>
  305. <httpHandlers>
  306.    
  307. </httpHandlers>
  308. </httpModules>
  309. </httpModules>
  310. </httpModules>
  311. </httpHandlers>//   默认实现方式:request.Headers["Serializer-Format"];<httpHandlers>
  312. <httpModules>
  313. <httpModules>
  314. <httpModules>
  315. <httpHandlers>
  316.    
  317. </httpHandlers>
  318. </httpModules>
  319. </httpModules>
  320. </httpModules>
  321. </httpHandlers><httpHandlers>
  322. <httpModules>
  323. <httpModules>
  324. <httpModules>
  325. <httpHandlers>
  326.    
  327. </httpHandlers>
  328. </httpModules>
  329. </httpModules>
  330. </httpModules>
  331. </httpHandlers>//   注意:这是我自定义的请求头名称,也可以不指定,默认为:form (表单)<httpHandlers>
  332. <httpModules>
  333. <httpModules>
  334. <httpModules>
  335. <httpHandlers>
  336.    
  337. </httpHandlers>
  338. </httpModules>
  339. </httpModules>
  340. </httpModules>
  341. </httpHandlers><httpHandlers>
  342. <httpModules>
  343. <httpModules>
  344. <httpModules>
  345. <httpHandlers>
  346.    
  347. </httpHandlers>
  348. </httpModules>
  349. </httpModules>
  350. </httpModules>
  351. </httpHandlers>string serializerFormat = FrameworkRules.GetSerializerFormat(context.Request);<httpHandlers>
  352. <httpModules>
  353. <httpModules>
  354. <httpModules>
  355. <httpHandlers>
  356.    
  357. </httpHandlers>
  358. </httpModules>
  359. </httpModules>
  360. </httpModules>
  361. </httpHandlers><httpHandlers>
  362. <httpModules>
  363. <httpModules>
  364. <httpModules>
  365. <httpHandlers>
  366.    
  367. </httpHandlers>
  368. </httpModules>
  369. </httpModules>
  370. </httpModules>
  371. </httpHandlers>ISerializerProvider serializerProvider =<httpHandlers>
  372. <httpModules>
  373. <httpModules>
  374. <httpModules>
  375. <httpHandlers>
  376.    
  377. </httpHandlers>
  378. </httpModules>
  379. </httpModules>
  380. </httpModules>
  381. </httpHandlers><httpHandlers>
  382. <httpModules>
  383. <httpModules>
  384. <httpModules>
  385. <httpHandlers>
  386.    
  387. </httpHandlers>
  388. </httpModules>
  389. </httpModules>
  390. </httpModules>
  391. </httpHandlers><httpHandlers>
  392. <httpModules>
  393. <httpModules>
  394. <httpModules>
  395. <httpHandlers>
  396.    
  397. </httpHandlers>
  398. </httpModules>
  399. </httpModules>
  400. </httpModules>
  401. </httpHandlers><httpHandlers>
  402. <httpModules>
  403. <httpModules>
  404. <httpModules>
  405. <httpHandlers>
  406.    
  407. </httpHandlers>
  408. </httpModules>
  409. </httpModules>
  410. </httpModules>
  411. </httpHandlers><httpHandlers>
  412. <httpModules>
  413. <httpModules>
  414. <httpModules>
  415. <httpHandlers>
  416.    
  417. </httpHandlers>
  418. </httpModules>
  419. </httpModules>
  420. </httpModules>
  421. </httpHandlers>SerializerProviderFactory.GetSerializerProvider(serializerFormat);<httpHandlers>
  422. <httpModules>
  423. <httpModules>
  424. <httpModules>
  425. <httpHandlers>
  426.    
  427. </httpHandlers>
  428. </httpModules>
  429. </httpModules>
  430. </httpModules>
  431. </httpHandlers><httpHandlers>
  432. <httpModules>
  433. <httpModules>
  434. <httpModules>
  435. <httpHandlers>
  436.    
  437. </httpHandlers>
  438. </httpModules>
  439. </httpModules>
  440. </httpModules>
  441. </httpHandlers>// 获取要调用方法的参数类型<httpHandlers>
  442. <httpModules>
  443. <httpModules>
  444. <httpModules>
  445. <httpHandlers>
  446.    
  447. </httpHandlers>
  448. </httpModules>
  449. </httpModules>
  450. </httpModules>
  451. </httpHandlers><httpHandlers>
  452. <httpModules>
  453. <httpModules>
  454. <httpModules>
  455. <httpHandlers>
  456.    
  457. </httpHandlers>
  458. </httpModules>
  459. </httpModules>
  460. </httpModules>
  461. </httpHandlers>Type destType = info.InvokeInfo.MethodAttrInfo.ParamType;<httpHandlers>
  462. <httpModules>
  463. <httpModules>
  464. <httpModules>
  465. <httpHandlers>
  466.    
  467. </httpHandlers>
  468. </httpModules>
  469. </httpModules>
  470. </httpModules>
  471. </httpHandlers><httpHandlers>
  472. <httpModules>
  473. <httpModules>
  474. <httpModules>
  475. <httpHandlers>
  476.    
  477. </httpHandlers>
  478. </httpModules>
  479. </httpModules>
  480. </httpModules>
  481. </httpHandlers>// 获取要调用的参数<httpHandlers>
  482. <httpModules>
  483. <httpModules>
  484. <httpModules>
  485. <httpHandlers>
  486.    
  487. </httpHandlers>
  488. </httpModules>
  489. </httpModules>
  490. </httpModules>
  491. </httpHandlers><httpHandlers>
  492. <httpModules>
  493. <httpModules>
  494. <httpModules>
  495. <httpHandlers>
  496.    
  497. </httpHandlers>
  498. </httpModules>
  499. </httpModules>
  500. </httpModules>
  501. </httpHandlers>context.Request.InputStream.Position = 0;<httpHandlers>
  502. <httpModules>
  503. <httpModules>
  504. <httpModules>
  505. <httpHandlers>
  506.    
  507. </httpHandlers>
  508. </httpModules>
  509. </httpModules>
  510. </httpModules>
  511. </httpHandlers>// 防止其它Module读取过,但没有归位。<httpHandlers>
  512. <httpModules>
  513. <httpModules>
  514. <httpModules>
  515. <httpHandlers>
  516.    
  517. </httpHandlers>
  518. </httpModules>
  519. </httpModules>
  520. </httpModules>
  521. </httpHandlers><httpHandlers>
  522. <httpModules>
  523. <httpModules>
  524. <httpModules>
  525. <httpHandlers>
  526.    
  527. </httpHandlers>
  528. </httpModules>
  529. </httpModules>
  530. </httpModules>
  531. </httpHandlers>object param = serializerProvider.Deserialize(destType, context.Request);<httpHandlers>
  532. <httpModules>
  533. <httpModules>
  534. <httpModules>
  535. <httpHandlers>
  536.    
  537. </httpHandlers>
  538. </httpModules>
  539. </httpModules>
  540. </httpModules>
  541. </httpHandlers><httpHandlers>
  542. <httpModules>
  543. <httpModules>
  544. <httpModules>
  545. <httpHandlers>
  546.    
  547. </httpHandlers>
  548. </httpModules>
  549. </httpModules>
  550. </httpModules>
  551. </httpHandlers><httpHandlers>
  552. <httpModules>
  553. <httpModules>
  554. <httpModules>
  555. <httpHandlers>
  556.    
  557. </httpHandlers>
  558. </httpModules>
  559. </httpModules>
  560. </httpModules>
  561. </httpHandlers><httpHandlers>
  562. <httpModules>
  563. <httpModules>
  564. <httpModules>
  565. <httpHandlers>
  566.    
  567. </httpHandlers>
  568. </httpModules>
  569. </httpModules>
  570. </httpModules>
  571. </httpHandlers>// 调用服务方法<httpHandlers>
  572. <httpModules>
  573. <httpModules>
  574. <httpModules>
  575. <httpHandlers>
  576.    
  577. </httpHandlers>
  578. </httpModules>
  579. </httpModules>
  580. </httpModules>
  581. </httpHandlers><httpHandlers>
  582. <httpModules>
  583. <httpModules>
  584. <httpModules>
  585. <httpHandlers>
  586.    
  587. </httpHandlers>
  588. </httpModules>
  589. </httpModules>
  590. </httpModules>
  591. </httpHandlers>object result = info.InvokeInfo.MethodAttrInfo.MethodInfo.Invoke(<httpHandlers>
  592. <httpModules>
  593. <httpModules>
  594. <httpModules>
  595. <httpHandlers>
  596.    
  597. </httpHandlers>
  598. </httpModules>
  599. </httpModules>
  600. </httpModules>
  601. </httpHandlers><httpHandlers>
  602. <httpModules>
  603. <httpModules>
  604. <httpModules>
  605. <httpHandlers>
  606.    
  607. </httpHandlers>
  608. </httpModules>
  609. </httpModules>
  610. </httpModules>
  611. </httpHandlers><httpHandlers>
  612. <httpModules>
  613. <httpModules>
  614. <httpModules>
  615. <httpHandlers>
  616.    
  617. </httpHandlers>
  618. </httpModules>
  619. </httpModules>
  620. </httpModules>
  621. </httpHandlers><httpHandlers>
  622. <httpModules>
  623. <httpModules>
  624. <httpModules>
  625. <httpHandlers>
  626.    
  627. </httpHandlers>
  628. </httpModules>
  629. </httpModules>
  630. </httpModules>
  631. </httpHandlers><httpHandlers>
  632. <httpModules>
  633. <httpModules>
  634. <httpModules>
  635. <httpHandlers>
  636.    
  637. </httpHandlers>
  638. </httpModules>
  639. </httpModules>
  640. </httpModules>
  641. </httpHandlers><httpHandlers>
  642. <httpModules>
  643. <httpModules>
  644. <httpModules>
  645. <httpHandlers>
  646.    
  647. </httpHandlers>
  648. </httpModules>
  649. </httpModules>
  650. </httpModules>
  651. </httpHandlers><httpHandlers>
  652. <httpModules>
  653. <httpModules>
  654. <httpModules>
  655. <httpHandlers>
  656.    
  657. </httpHandlers>
  658. </httpModules>
  659. </httpModules>
  660. </httpModules>
  661. </httpHandlers><httpHandlers>
  662. <httpModules>
  663. <httpModules>
  664. <httpModules>
  665. <httpHandlers>
  666.    
  667. </httpHandlers>
  668. </httpModules>
  669. </httpModules>
  670. </httpModules>
  671. </httpHandlers>info.InvokeInfo.ServiceInstance, new object[] { param });<httpHandlers>
  672. <httpModules>
  673. <httpModules>
  674. <httpModules>
  675. <httpHandlers>
  676.    
  677. </httpHandlers>
  678. </httpModules>
  679. </httpModules>
  680. </httpModules>
  681. </httpHandlers><httpHandlers>
  682. <httpModules>
  683. <httpModules>
  684. <httpModules>
  685. <httpHandlers>
  686.    
  687. </httpHandlers>
  688. </httpModules>
  689. </httpModules>
  690. </httpModules>
  691. </httpHandlers>// 写输出结果<httpHandlers>
  692. <httpModules>
  693. <httpModules>
  694. <httpModules>
  695. <httpHandlers>
  696.    
  697. </httpHandlers>
  698. </httpModules>
  699. </httpModules>
  700. </httpModules>
  701. </httpHandlers><httpHandlers>
  702. <httpModules>
  703. <httpModules>
  704. <httpModules>
  705. <httpHandlers>
  706.    
  707. </httpHandlers>
  708. </httpModules>
  709. </httpModules>
  710. </httpModules>
  711. </httpHandlers>if( result != null )<httpHandlers>
  712. <httpModules>
  713. <httpModules>
  714. <httpModules>
  715. <httpHandlers>
  716.    
  717. </httpHandlers>
  718. </httpModules>
  719. </httpModules>
  720. </httpModules>
  721. </httpHandlers><httpHandlers>
  722. <httpModules>
  723. <httpModules>
  724. <httpModules>
  725. <httpHandlers>
  726.    
  727. </httpHandlers>
  728. </httpModules>
  729. </httpModules>
  730. </httpModules>
  731. </httpHandlers><httpHandlers>
  732. <httpModules>
  733. <httpModules>
  734. <httpModules>
  735. <httpHandlers>
  736.    
  737. </httpHandlers>
  738. </httpModules>
  739. </httpModules>
  740. </httpModules>
  741. </httpHandlers>serializerProvider.Serializer(result, context.Response);<httpHandlers>
  742. <httpModules>
  743. <httpModules>
  744. <httpModules>
  745. <httpHandlers>
  746.    
  747. </httpHandlers>
  748. </httpModules>
  749. </httpModules>
  750. </httpModules>
  751. </httpHandlers>}<httpHandlers>
  752. <httpModules>
  753. <httpModules>
  754. <httpModules>
  755. <httpHandlers>
  756.    
  757. </httpHandlers>
  758. </httpModules>
  759. </httpModules>
  760. </httpModules>
  761. </httpHandlers>///<httpHandlers>
  762. <httpModules>
  763. <httpModules>
  764. <httpModules>
  765. <httpHandlers>
  766.    
  767. </httpHandlers>
  768. </httpModules>
  769. </httpModules>
  770. </httpModules>
  771. </httpHandlers> /// 【外部接口】用于根据服务的类名和方法名执行某个请求<httpHandlers>
  772. <httpModules>
  773. <httpModules>
  774. <httpModules>
  775. <httpHandlers>
  776.    
  777. </httpHandlers>
  778. </httpModules>
  779. </httpModules>
  780. </httpModules>
  781. </httpHandlers>///<httpHandlers>
  782. <httpModules>
  783. <httpModules>
  784. <httpModules>
  785. <httpHandlers>
  786.    
  787. </httpHandlers>
  788. </httpModules>
  789. </httpModules>
  790. </httpModules>
  791. </httpHandlers> ///<httpHandlers>
  792. <httpModules>
  793. <httpModules>
  794. <httpModules>
  795. <httpHandlers>
  796.    
  797. </httpHandlers>
  798. </httpModules>
  799. </httpModules>
  800. </httpModules>
  801. </httpHandlers> ///<httpHandlers>
  802. <httpModules>
  803. <httpModules>
  804. <httpModules>
  805. <httpHandlers>
  806.    
  807. </httpHandlers>
  808. </httpModules>
  809. </httpModules>
  810. </httpModules>
  811. </httpHandlers> public static void ProcessRequest(HttpContext context, NamesPair pair)<httpHandlers>
  812. <httpModules>
  813. <httpModules>
  814. <httpModules>
  815. <httpHandlers>
  816.    
  817. </httpHandlers>
  818. </httpModules>
  819. </httpModules>
  820. </httpModules>
  821. </httpHandlers>{<httpHandlers>
  822. <httpModules>
  823. <httpModules>
  824. <httpModules>
  825. <httpHandlers>
  826.    
  827. </httpHandlers>
  828. </httpModules>
  829. </httpModules>
  830. </httpModules>
  831. </httpHandlers><httpHandlers>
  832. <httpModules>
  833. <httpModules>
  834. <httpModules>
  835. <httpHandlers>
  836.    
  837. </httpHandlers>
  838. </httpModules>
  839. </httpModules>
  840. </httpModules>
  841. </httpHandlers>if( pair == null )<httpHandlers>
  842. <httpModules>
  843. <httpModules>
  844. <httpModules>
  845. <httpHandlers>
  846.    
  847. </httpHandlers>
  848. </httpModules>
  849. </httpModules>
  850. </httpModules>
  851. </httpHandlers><httpHandlers>
  852. <httpModules>
  853. <httpModules>
  854. <httpModules>
  855. <httpHandlers>
  856.    
  857. </httpHandlers>
  858. </httpModules>
  859. </httpModules>
  860. </httpModules>
  861. </httpHandlers><httpHandlers>
  862. <httpModules>
  863. <httpModules>
  864. <httpModules>
  865. <httpHandlers>
  866.    
  867. </httpHandlers>
  868. </httpModules>
  869. </httpModules>
  870. </httpModules>
  871. </httpHandlers>throw new ArgumentNullException("pair");<httpHandlers>
  872. <httpModules>
  873. <httpModules>
  874. <httpModules>
  875. <httpHandlers>
  876.    
  877. </httpHandlers>
  878. </httpModules>
  879. </httpModules>
  880. </httpModules>
  881. </httpHandlers><httpHandlers>
  882. <httpModules>
  883. <httpModules>
  884. <httpModules>
  885. <httpHandlers>
  886.    
  887. </httpHandlers>
  888. </httpModules>
  889. </httpModules>
  890. </httpModules>
  891. </httpHandlers>if( string.IsNullOrEmpty(pair.ServiceName) || string.IsNullOrEmpty(pair.MethodName) )<httpHandlers>
  892. <httpModules>
  893. <httpModules>
  894. <httpModules>
  895. <httpHandlers>
  896.    
  897. </httpHandlers>
  898. </httpModules>
  899. </httpModules>
  900. </httpModules>
  901. </httpHandlers><httpHandlers>
  902. <httpModules>
  903. <httpModules>
  904. <httpModules>
  905. <httpHandlers>
  906.    
  907. </httpHandlers>
  908. </httpModules>
  909. </httpModules>
  910. </httpModules>
  911. </httpHandlers><httpHandlers>
  912. <httpModules>
  913. <httpModules>
  914. <httpModules>
  915. <httpHandlers>
  916.    
  917. </httpHandlers>
  918. </httpModules>
  919. </httpModules>
  920. </httpModules>
  921. </httpHandlers>ExceptionHelper.Throw404Exception(context);<httpHandlers>
  922. <httpModules>
  923. <httpModules>
  924. <httpModules>
  925. <httpHandlers>
  926.    
  927. </httpHandlers>
  928. </httpModules>
  929. </httpModules>
  930. </httpModules>
  931. </httpHandlers><httpHandlers>
  932. <httpModules>
  933. <httpModules>
  934. <httpModules>
  935. <httpHandlers>
  936.    
  937. </httpHandlers>
  938. </httpModules>
  939. </httpModules>
  940. </httpModules>
  941. </httpHandlers>InvokeInfo vkInfo = ReflectionHelper.GetInvokeInfo(pair);<httpHandlers>
  942. <httpModules>
  943. <httpModules>
  944. <httpModules>
  945. <httpHandlers>
  946.    
  947. </httpHandlers>
  948. </httpModules>
  949. </httpModules>
  950. </httpModules>
  951. </httpHandlers><httpHandlers>
  952. <httpModules>
  953. <httpModules>
  954. <httpModules>
  955. <httpHandlers>
  956.    
  957. </httpHandlers>
  958. </httpModules>
  959. </httpModules>
  960. </httpModules>
  961. </httpHandlers>if( vkInfo == null )<httpHandlers>
  962. <httpModules>
  963. <httpModules>
  964. <httpModules>
  965. <httpHandlers>
  966.    
  967. </httpHandlers>
  968. </httpModules>
  969. </httpModules>
  970. </httpModules>
  971. </httpHandlers><httpHandlers>
  972. <httpModules>
  973. <httpModules>
  974. <httpModules>
  975. <httpHandlers>
  976.    
  977. </httpHandlers>
  978. </httpModules>
  979. </httpModules>
  980. </httpModules>
  981. </httpHandlers><httpHandlers>
  982. <httpModules>
  983. <httpModules>
  984. <httpModules>
  985. <httpHandlers>
  986.    
  987. </httpHandlers>
  988. </httpModules>
  989. </httpModules>
  990. </httpModules>
  991. </httpHandlers>ExceptionHelper.Throw404Exception(context);<httpHandlers>
  992. <httpModules>
  993. <httpModules>
  994. <httpModules>
  995. <httpHandlers>
  996.    
  997. </httpHandlers>
  998. </httpModules>
  999. </httpModules>
  1000. </httpModules>
  1001. </httpHandlers><httpHandlers>
  1002. <httpModules>
  1003. <httpModules>
  1004. <httpModules>
  1005. <httpHandlers>
  1006.    
  1007. </httpHandlers>
  1008. </httpModules>
  1009. </httpModules>
  1010. </httpModules>
  1011. </httpHandlers>ServiceInfo info = new ServiceInfo(pair, vkInfo);<httpHandlers>
  1012. <httpModules>
  1013. <httpModules>
  1014. <httpModules>
  1015. <httpHandlers>
  1016.    
  1017. </httpHandlers>
  1018. </httpModules>
  1019. </httpModules>
  1020. </httpModules>
  1021. </httpHandlers><httpHandlers>
  1022. <httpModules>
  1023. <httpModules>
  1024. <httpModules>
  1025. <httpHandlers>
  1026.    
  1027. </httpHandlers>
  1028. </httpModules>
  1029. </httpModules>
  1030. </httpModules>
  1031. </httpHandlers>ProcessRequest(context, info);<httpHandlers>
  1032. <httpModules>
  1033. <httpModules>
  1034. <httpModules>
  1035. <httpHandlers>
  1036.    
  1037. </httpHandlers>
  1038. </httpModules>
  1039. </httpModules>
  1040. </httpModules>
  1041. </httpHandlers>}<httpHandlers>
  1042. <httpModules>
  1043. <httpModules>
  1044. <httpModules>
  1045. <httpHandlers>
  1046.    
  1047. </httpHandlers>
  1048. </httpModules>
  1049. </httpModules>
  1050. </httpModules>
  1051. </httpHandlers><httpHandlers>
  1052. <httpModules>
  1053. <httpModules>
  1054. <httpModules>
  1055. <httpHandlers>
  1056.    
  1057. </httpHandlers>
  1058. </httpModules>
  1059. </httpModules>
  1060. </httpModules>
  1061. </httpHandlers>}
复制代码
关于写框架

以前曾在网上见过几次关于“重复造轮子”的说法。基本上,全是反对意见。
我今天也想谈谈这个话题:要不要自己写框架?
我的答案是:要。
自己写框架的好处不在于能将它做得多强大,多完美,而是从写框架的过程中,可以学到很多东西。
一个框架写完了,不在乎要给多少人使用,而是自己感觉有没有进步,这才是关键。
如果您不重复造轮子,可能永远不知道造轮子的过程,造轮子需要什么内容。
如果不重复造轮子,世界上将只有一个操作系统。
如果不重复造轮子,世界上将只有一个数据库。
如果不重复造轮子,世界上将只有一种编程语言。
这样单调会很好吗?

WebForms, MVC, Linq To SQL, Entity Framework, Remoting, Web Service, WCF
微软不也是一直在重复造轮子吗?
结束语

终于写完了这篇博客。这篇博客花了我最多的写作时间:整整二个周末还加上一些业余时间。
当然了,其中也包括实现框架的时间。这其实也是希望更好地展示Asp.net的核心内容。
写框架不是目标,展示Asp.net技术,写博客才是目标哦。
因此,这篇博客可谓是【下足了料】,只希望:
1. 能给大家分享Asp.net的核心内容。
2. 这篇博客的成绩能赶上【细说Cookie】。
我的写博热情也离不开您的肯定支持哦,如果您认为阅读此文有收获,别忘了点一下右下角的【推荐】,【关注 Fish Li】。
Asp.net是个伟大的平台,能完成许多应用。这些应用的实现离不开这二次博客所提过的核心对象的支持,
本来还想再写点其它的示例,只是时间花得太多了。今天的示例已经很精彩了,到此为止吧,我也想休息了。
每个对象都是一个不朽的传奇,每个传奇背后都有一个精彩的故事。
我是Fish Li, 感谢大家阅读我的博客,请继续关注我的后续博客。

点击此处下载示例代码
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】按钮。
如果,您希望更容易地发现我的新博客,不妨点击一下右下角的【关注 Fish Li】。
因为,我的写作热情也离不开您的肯定支持。
感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是Fish Li 。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册