ASP.NET 4.0 URL路由HTTP错误404.0 - 未找到

时间:2010-08-19 15:15:54

标签: routing asp.net-4.0

我使用以下路径在ASP.NET 4.0中实现了URL路由。

routes.MapPageRoute(
   "NewsDetails",               // Route name
   "news/{i}/{*n}",  // Route URL
   "~/newsdetails.aspx"      // Web page to handle route
    );

给我的网址像

http://www.mysie.com/news/1/this-is-test-news

这在我的localhost工作正常。

但是当我把它上传到服务器上时它会给出......

Server Error

404 - File or directory not found.
The resource you are looking for might have been removed, had its name changed, 
or is temporarily unavailable.

如果我尝试http://www.mysie.com/news/1/this-is-test-news.aspx,则显示页面。

有没有人有同样的问题?

如何设置网址 http://www.mysie.com/news/1/this-is-test-news可以在Windows Server 2008上运行吗?

3 个答案:

答案 0 :(得分:33)

使用IIS 7.5启用默认的ASP.Net 4.0路由:

  1. 确保您已安装 HTTP重定向功能 它可以完成 - >控制面板 - > Progams - >关闭Windows功能 - >万维网服务 - >常见的HTTP功能 - > HTTP重定向
  2. 使用以下代码
  3. 修改您的web.config

    <system.webServer>   
        <modules runAllManagedModulesForAllRequests="true">    
            <remove name="UrlRoutingModule"/>
            <add name="UrlRoutingModule" 
                 type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </modules>
        <handlers>
            <add name="UrlRoutingHandler" 
                 preCondition="integratedMode" 
                 verb="*" 
                 path="UrlRouting.axd" 
                 type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
        </handlers>
    </system.webServer>
    

    3。在global.asax文件中创建路由

      

    注意:您必须将应用程序池设置为 Asp.net 4.0应用程序池,因为路由无法与 Asp.net 4.0 Classic Application池一起使用。

    希望这会有所帮助。

答案 1 :(得分:1)

我已阅读了您的所有食谱,但我的网站( ASP.NET 4.0 + VS2010 + Cassini )仍未正确路由

我网站的虚拟路径是“CompanyName.ApplicationName.Web”。我将此虚拟更改为“MyApplicationName”并瞧!

更改Cassini的虚拟路径配置:

  • 卡西尼的虚拟路径 - &gt; Ctrl + W,P或;
  • 右键单击网站和“属性窗口”。

答案 2 :(得分:1)

我的解决方案,在尝试了一切之后:

部署不当,旧的 PrecompiledApp.config 挂在我的部署位置,并使一切都无法正常工作。

我的最终设置有效:

  • IIS 7.5,Win2k8r2 x64,
  • 集成模式应用程序池
  • web.config中没有任何变化 - 这意味着没有用于路由的特殊处理程序。这是我很多其他帖子参考的部分的快照。我正在使用FluorineFX,所以我确实添加了该处理程序,但我不需要任何其他程序:

    <system.web>
      <compilation debug="true" targetFramework="4.0" />
      <authentication mode="None"/>
    
      <pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
      <httpRuntime requestPathInvalidCharacters=""/>
    
      <httpModules>
        <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx"/>
      </httpModules>
    </system.web>
      <system.webServer>
        <!-- Modules for IIS 7.0 Integrated mode -->
        <modules>
          <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx" />
        </modules>
    
        <!-- Disable detection of IIS 6.0 / Classic mode ASP.NET configuration -->
        <validation validateIntegratedModeConfiguration="false" />
      </system.webServer>
    
  • Global.ashx :(只有任何注释的方法)

    void Application_Start(object sender, EventArgs e) {
        // Register routes...
        System.Web.Routing.Route echoRoute = new System.Web.Routing.Route(
              "{*message}",
            //the default value for the message
              new System.Web.Routing.RouteValueDictionary() { { "message", "" } },
            //any regular expression restrictions (i.e. @"[^\d].{4,}" means "does not start with number, at least 4 chars
              new System.Web.Routing.RouteValueDictionary() { { "message", @"[^\d].{4,}" } },
              new TestRoute.Handlers.PassthroughRouteHandler()
           );
    
        System.Web.Routing.RouteTable.Routes.Add(echoRoute);
    }
    
  • PassthroughRouteHandler.cs - 这实现了从http://andrew.arace.info/stackoverflowhttp://andrew.arace.info/#stackoverflow的自动转换,然后由default.aspx处理:

    public class PassthroughRouteHandler : IRouteHandler {
    
        public IHttpHandler GetHttpHandler(RequestContext requestContext) {
            HttpContext.Current.Items["IncomingMessage"] = requestContext.RouteData.Values["message"];
            requestContext.HttpContext.Response.Redirect("#" + HttpContext.Current.Items["IncomingMessage"], true);
            return null;
        }
    }