Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NETC#路由;HttpHandler;和HttpModule不工作_C#_Asp.net_Asp.net 4.0_Httphandler_Httpmodule - Fatal编程技术网

ASP.NETC#路由;HttpHandler;和HttpModule不工作

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进行优化(因此需要处理程序) 问题 我想要

我在自定义扩展和拦截现有处理程序方面遇到了不少问题

我想做什么

基于持久化选项,我希望所有“虚拟”扩展都由集合处理程序处理。所有页面都是动态生成的,站点上不存在实际文件。网站填充内容,形成html输出,并将其作为web结果返回。 这是必需的,因为我正在两台服务器之间建立胖/瘦关系。瘦服务器只需将请求传递给fat服务器,在fat服务器上处理请求并返回响应。 该项目是一个动态多域内容管理系统。精简服务器可能与.net不兼容(因此需要外部请求),但将对.net进行优化(因此需要处理程序)

问题

我想要的是重新路由现有的扩展-aspx;php;html。 我已经在本地环境中使用自定义的HttpModule实现了这一点,该模块设置了适当的处理程序。我已经探索过在config中设置标记,但是使用持久化的动态规则重新路由扩展

如前所述,此解决方案适用于本地主机。 上载时,模块会正确处理.Net扩展,但任何自定义扩展或非.Net扩展都会返回404错误

为了寻找另一种选择,我尝试了全局路由,但这也不起作用

我还尝试使用注册自定义扩展。。。但每一个都会遇到相同的结果-404未找到


全局路由尝试:
.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