ASP.NETC#路由;HttpHandler;和HttpModule不工作
我在自定义扩展和拦截现有处理程序方面遇到了不少问题 我想做什么 基于持久化选项,我希望所有“虚拟”扩展都由集合处理程序处理。所有页面都是动态生成的,站点上不存在实际文件。网站填充内容,形成html输出,并将其作为web结果返回。 这是必需的,因为我正在两台服务器之间建立胖/瘦关系。瘦服务器只需将请求传递给fat服务器,在fat服务器上处理请求并返回响应。 该项目是一个动态多域内容管理系统。精简服务器可能与.net不兼容(因此需要外部请求),但将对.net进行优化(因此需要处理程序) 问题 我想要的是重新路由现有的扩展-aspx;php;html。 我已经在本地环境中使用自定义的HttpModule实现了这一点,该模块设置了适当的处理程序。我已经探索过在config中设置标记,但是使用持久化的动态规则重新路由扩展 如前所述,此解决方案适用于本地主机。 上载时,模块会正确处理.Net扩展,但任何自定义扩展或非.Net扩展都会返回404错误 为了寻找另一种选择,我尝试了全局路由,但这也不起作用 我还尝试使用注册自定义扩展。。。但每一个都会遇到相同的结果-404未找到ASP.NETC#路由;HttpHandler;和HttpModule不工作,c#,asp.net,asp.net-4.0,httphandler,httpmodule,C#,Asp.net,Asp.net 4.0,Httphandler,Httpmodule,我在自定义扩展和拦截现有处理程序方面遇到了不少问题 我想做什么 基于持久化选项,我希望所有“虚拟”扩展都由集合处理程序处理。所有页面都是动态生成的,站点上不存在实际文件。网站填充内容,形成html输出,并将其作为web结果返回。 这是必需的,因为我正在两台服务器之间建立胖/瘦关系。瘦服务器只需将请求传递给fat服务器,在fat服务器上处理请求并返回响应。 该项目是一个动态多域内容管理系统。精简服务器可能与.net不兼容(因此需要外部请求),但将对.net进行优化(因此需要处理程序) 问题 我想要
全局路由尝试:
.Config(用于处理程序和模块尝试)
所有处理程序都是实现以下功能的标准处理程序:
public class SqlRequestHandler : IHttpHandler, IRequiresSessionState, IRouteHandler
同样,首选方法HttpModule可以在本地主机上工作。这可能是一个服务器配置问题(在这种情况下,我正在寻找解决办法),但处理.net扩展的事实很奇怪,因为这意味着不应应用中等信任问题,但是服务器上处理扩展的问题可能优先于.net应用程序 服务器是共享主机(因此我无法更改machine.config文件),是使用4.0的IIS6 感谢您对如何解决此问题提出的任何建议。
Mike您需要在IIS 6.0中配置网站,以将所有扩展(包括称为的无扩展路径)路由到ASP.NET ISAPI dll(并禁用文件存在检查) 当然,您只能有选择地对那些希望通过ASP.NET代码路由的扩展进行映射。但如果您没有预定义的扩展集,则通配符映射将更有用 在没有此类映射的情况下,IIS不会将未知扩展名的请求转发到ASP.NET(路由代码甚至不会出现),而是将扩展名传递给默认(静态文件)处理程序,如果文件不存在,该处理程序将发出404 请参阅这篇描述这些步骤的文章(针对ASP.NET MVC,但同样适用于您的案例):
在文章末尾,作者介绍了如何添加通配符脚本映射。您需要在IIS 6.0中配置网站,以将所有扩展(包括称为的无扩展路径)路由到ASP.NET ISAPI dll(并禁用文件存在检查) 当然,您只能有选择地对那些希望通过ASP.NET代码路由的扩展进行映射。但如果您没有预定义的扩展集,则通配符映射将更有用 在没有此类映射的情况下,IIS不会将未知扩展名的请求转发到ASP.NET(路由代码甚至不会出现),而是将扩展名传递给默认(静态文件)处理程序,如果文件不存在,该处理程序将发出404 请参阅这篇描述这些步骤的文章(针对ASP.NET MVC,但同样适用于您的案例):
在文章末尾,作者给出了如何添加通配符脚本映射谢谢您的回复。很遗憾,我不是服务器的所有者,无法访问IIS服务器设置。但这将是解决此问题的最佳解决方案@SisBerMike,虽然您不是web服务器的所有者,但为什么您不能请求服务器管理员为您的网站进行必要的设置(应该由您控制)?谢谢您的回复。很遗憾,我不是服务器的所有者,无法访问IIS服务器设置。但这将是解决此问题的最佳解决方案@SisBerMike,虽然您不是web服务器的所有者,但为什么您不能请求服务器管理员为您的网站进行必要的设置(应该由您控制)?好的,我想到了一个解决方法。。。而且不漂亮!由于我无法访问服务器设置,我不得不使用主机提供商提供的控制面板。我能够将404个错误响应指向脚本化的aspx页面。作为一种解决方法,我已经设置了一个ashx处理程序来从错误页面重建原始url请求(因为这是在查询字符串中发送的)。。。并从fat服务器检索响应。这不是一个理想的和垃圾黑客,我宁愿重新工作。如果有人有其他想法。。。请发帖。好的,我已经想到了一个解决办法。。。而且不漂亮!由于我无法访问服务器设置,我不得不使用主机提供商提供的控制面板。我能够将404个错误响应指向脚本化的aspx页面。作为一种解决方法,我已经设置了一个ashx处理程序来从错误页面重建原始url请求(因为这是在查询字符串中发送的)。。。并从fat服务器检索响应。这不是一个理想的和垃圾黑客,我宁愿重新工作。如果有人有其他想法。。。请邮寄。
<system.web>
<compilation debug="true" targetFramework="4.0" />
<httpRuntime requestValidationMode="2.0" />
<customErrors mode="Off"/>
<httpHandlers>
<add path="*.sqs" verb="*" type="CmsMapper.VirtualHandler, CmsMapper" />
<add path="*.sql" verb="*" type="CmsMapper.VirtualHandler, CmsMapper" />
</httpHandlers>
<httpModules>
<add name="SisBerCMS" type="CmsMapper.VirtualModule, CmsMapper" />
</httpModules>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<modules>
<add name="SisBerCMS" type="CmsMapper.VirtualModule, CmsMapper" />
</modules>
<handlers>
<add path="*.sqs" verb="*" type="CmsMapper.VirtualHandler, CmsMapper" name="sqsHandler" />
<add path="*.sql" verb="*" type="CmsMapper.VirtualHandler, CmsMapper" name="sqlHandler" />
</handlers>
</system.webServer>
if (extentionMap != null)
{
// note that extentionMap.ExtentionType is a predetermined enum
switch (extentionMap.ExtentionType)
{
// If the extention is banned then pass back a generic message
case ExtentionType.Banned:
this.WriteTextResponce("Invalid extention detected:" + extentionMap.Extention);
break;
// Remap .Ajax requests to the ajax handler
case ExtentionType.Ajax:
this._app.Context.RemapHandler(new AjaxHandler());
break;
// Remap session query or sql requests to the sql handler
case ExtentionType.SessionQuery:
this._app.Context.RemapHandler(new SqlRequestHandler());
break;
// if the extention is not ignored, re map to the virtual page handler
default:
bool isManagementServer = this._app.Context.Request.Url.Authority != VirtualModule.RESPONSE_SERVER;
bool isPostRequest = !String.IsNullOrEmpty(this._app.Context.Request.Form[HtmlRequest.RequestOrigin]);
bool isGetRequest = !String.IsNullOrEmpty(this._app.Context.Request.QueryString[HtmlRequest.RequestOrigin]);
bool isIgnored = extentionMap.ExtentionType == ExtentionType.Ignore;
if ((isPostRequest || isGetRequest) && !isIgnored)
{
this._app.Context.RemapHandler(new VirtualHandler());
}
else
{
this._app.Context.RemapHandler(new ExternalRequestHandler());
}
break;
}
}
public class SqlRequestHandler : IHttpHandler, IRequiresSessionState, IRouteHandler