2012-10-06 31 views
1

对于自定义HTTP处理程序,有一些不太清楚。自定义文件扩展名的HTTP处理程序和404错误

我创建根据this blog post 我已经注册了处理程序在我的web.config文件中的下列方式ScriptTranslator HTTP处理程序:

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <handlers> 
     <add name="ScriptTranslatorHandler" path="*.js.axd" verb="*" type="CamelotShiftManagement.HttpHandlers.ScriptTranslator" /> 
    </handlers> 
</system.webServer> 

我还添加了一个IgnoreRoute命令我的Global.asax所以web-app可以根据we.config文件启动处理程序。

routes.IgnoreRoute("{resource}.js.axd/{*pathInfo}"); 

处理程序是假设翻译从我的HTML文件JS文件引用,所以我修改我的脚本参考,并在末尾添加一个axd扩展。

处理程序收到没有AXD extention拿到剧本的内容是需要翻译的文件的请求和搜索,这里是基本ProccessRequest行动:

public void ProcessRequest(HttpContext context) 
{ 
    string relativePath = context.Request.AppRelativeCurrentExecutionFilePath.Replace(".axd", string.Empty); 
    string absolutePath = context.Server.MapPath(relativePath); 
    string script = ReadFile(absolutePath); 

    string translated = TranslateScript(script,CultureInfo.CurrentCulture); 
    context.Response.Write(translated); 
    Compress(context); 
    SetHeadersAndCache(absolutePath, context); 
} 
在我的HTML文件我

所以只修改脚本标记的引用,没有名为myscript.js.axd的实际文件,有一个名为myscript.js的文件。

我收到404错误。

我是新来创建和使用自定义的Http处理程序,我不知道从使用期望什么。

引用的blog post意味着代码中应该没有实际的.js.axd文件,并且脚本引用的请求将重新路由到处理程序,并使用代码中的前两行处理实际的.js文件我在此之前提供。

我更喜欢天气还是不设置自定义HTTP处理程序应该首先运行处理程序代码,然后才会抛出404错误,或者我应该创建一个虚拟myScript.js.axd文件来支持处理程序操作?

回答

2

忽略url必须是这样的:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.IgnoreRoute("Scripts/{resource}.js.axd/{*pathInfo}"); 

然后加:

<system.web> 
    <httpHandlers> 
     <add path="*.js.axd" verb="*" type="..." /> 
    </httpHandlers> 
    ... 
    </system.web> 

和:

<system.webServer> 
    ... 
    <handlers> 
     <add name="ScriptTranslatorHandler" path="*.js.axd" verb="*" type="..." /> 
    </handlers> 
    </system.webServer> 

还要检查名称空间,文件ScriptTranslator.cs不包含它

补充:

默认routes.IgnoreRoute("{resource}.axd/{*pathInfo}");仅忽略localhost/test.axd,而不是“本地主机/主页/ test.axd`,然后应用程序试图找到匹配的路由,并不能找到它,那么我们就收到404

+0

确实做到了正如你写的那样..我唯一需要改变的是传递给'IgnoreRoute'的值..你在{resource}之前添加了“Scripts /”,但仍然无效。你对'ScriptTranslator.cs'的命名空间有什么意义?目前它是'CamelotShiftManagement.HttpHandlers' – Mortalus

+0

没关系!我自己找到它..脚本本身位于/脚本的子文件夹中...所以我改变了值/脚本/管理/和presto ..它的工作..现在又一个问题..我怎么能在脚本下的所有子文件夹的忽略规则? – Mortalus

+1

@Mortalus尝试类似于:'routes.IgnoreRoute(“Scripts/{folder}/{resource} .js.axd/{* pathInfo}”);' – webdeveloper