使用IHttpHandler處理請求,實現webapi功能.html
研究asp.net管道處理事件後,可用此法實現webapi功能.git
測試環境 VS2017 WIN10 IIS10 集成模式github
關鍵接口類兩個 IHttpHandlerFactory 和 IHttpHandler web
處理過程api
1.實現IHttpHandlerFactory,它的做用是指定由哪個IHttpHandler來處理請求.在第7個事件時執行.asp.net
2.在第11個事件時,執行IHttpHandler.在這個處理類中,分析URL地址,使用反射找到對應的類和方法執行之.測試
具體作法ui
1.新建一個.net framework類庫項目,添加兩個類,分別實現IHttpHandlerFactory IHttpHandler (注意添加System.Web程序集)url
// 實現IHttpHandlerFactoryspa
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
// 類的做用就是返回一個IHttpHandler
return new ApiHandler();
}
// ApiHandler()類 實現IHttpHandler
public void ProcessRequest(HttpContext context)
{
// 分解URL路徑用於找類名和方法名
string[] urlparts = context.Request.RawUrl.Split('/');
string apiClassN = urlparts[1];
string apiMethodN = urlparts[2];
// 反射找到這個類,實現化之.而且傳入context上下文對象
Type webapiT = Assembly.GetExecutingAssembly().GetType(apiClassN, false, true);
WebApiBase workapi = (WebApiBase)Activator.CreateInstance(webapiT, true);
workapi.SetHttpContext(context);
// 執行方法
webapiMethod.Invoke(workapi, null);
// 此至,完成請求
}
2.webconfig須要添加處理程序映射.注意path "*." ,它匹配 /user/info 這種不帶擴展名的路徑
<add name="FactoryHandler" path="*." verb="*" type="FactoryHandlerFactory" resourceType="Unspecified" preCondition="integratedMode" />
3.對於靜態文件,不須要走處理管道,使用系統的靜態文件處理模塊.配置以下
<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" />
4.能夠建一個.net framework類庫項目,添加上述文件.掛到IIS下,使用集成模式.能夠用於webapi處理請求.
5.示例代碼