近期有Linux ASP.NET用戶反映,在MVC網站的Web.config中添加 httpHandlers 配置用於處理自定義類型,可是在運行中並無產生預期的效果,服務器返回了404(找不到網頁)錯誤。經我親自測試,在WebForm網站中,httpHandlers節點的配置是有效的,而在MVC中的確無效。若是這個問題不能解決,將嚴重影響Linux ASP.NET的部署,也影響WIN ASP.NET向Linux遷移的兼容性和完整性。服務器
形成httpHandlers無效的緣由我並無時間去深究,爲了可以及時解決這個問題,我把注意力放到了Global.asax文件的Application_BeginRequest方法上,而後給出以下的解決方案。測試
一,在global.asax中添加一個靜態方法:網站
static bool TryHanler<T>(string ext) where T : IHttpHandler
{
if (string.IsNullOrEmpty(ext)) return false;
var context = HttpContext.Current;
var path = context.Request.AppRelativeCurrentExecutionFilePath;
if (!path.EndsWith(ext)) return false;
var handle = Activator.CreateInstance(typeof(T)) as IHttpHandler;
if (handle == null) return false;
handle.ProcessRequest(context);
context.Response.End();
return true;
}orm
說明:這是一個泛型方法,T表明你用於處理某個路徑的繼承自IHttpHandler的自定義類,參數ext是這個處理類所處理的請求路徑的擴展名(含「.」號)。繼承
二,在global.asax中實現Application_BeginRequest方法,並在該方法中調用TryHandler。如:部署
protected void Application_BeginRequest(object sender, EventArgs e)
{
if(TryHandler<myHandler>(".do")) return;
}string
注:該處理方案具備通用性,能同時兼容 Windows IIS和 Linux Jexus或XSP。it