打破我的头以获取URL路径在IIS 7的托管环境:ASP.NET(Breaking my head

2019-08-31 11:18发布

我试图实现使用System.Web.Routing ASP.NET URL路由。 这似乎很好地工作在我的本地但是当我去住我得到一个IIS(未找到文件)7的404错误。 FYI的主机使用Windows Server 2008的IIS7。

我认为这是使在处理路由机制存在差异。 但我无法弄清楚究竟什么发生。 下面是我做了迄今为止得到它的工作,并给予一定的信用,以自己这本地工作绝对没问题的设置和更改。

web.config设置

然后,我有一个具有以下标记一个system.webserver节

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      <add name="UrlRoutingModule"
               type="System.Web.Routing.UrlRoutingModule, 
                   System.Web.Routing, Version=3.5.0.0, 
                   Culture=neutral, 
                   PublicKeyToken=31BF3856AD364E35" />

    </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>

然后在Application_Start部分我已经定义了一个路线如下:

void Application_Start(object sender, EventArgs e) 
{
    RegisterRoutes(RouteTable.Routes); 
}
void RegisterRoutes(RouteCollection routes)
{               
    routes.Add(
       "MyRoute",
          new Route("ProductDetail/{ProductId}/{ProductName}",
                new MyRouteHandler("~/ProductDetail.aspx")));
}

最后MyRouteHandler如下所示:

 public IHttpHandler GetHttpHandler(RequestContext requestContext)
 {
     var display = (Page)BuildManager.CreateInstanceFromVirtualPath(
                     _virtualPath, typeof(Page));
     HttpContext.Current.Items["ProductId"] = requestContext.RouteData.Values["Product"]; 
     return display;
 }

和路由页面上,我抓住了产品ID如下

ProductId = (int)HttpContext.Current.Items["Product"];

这是我惹的结束。 这在当地正常工作。 我一直在想这一段时间,但至今没有成功。

任何帮助将十分赞赏。

谢谢...

Answer 1:

不知道你是否能找出问题是什么......但是如果你还在寻找一个解决方案,那么你可以尝试以下。 我不得不面对同样的局面一段时间回来,并得到了它在网络配置,而您将不再需要任何路由机制使用重写规则工作。 因此,首先我会鼓励你删除任何路由设置,您可能已经和代码Global.asax文件了。

然后在部分则可以按如下添加为重写规则

<rewrite>
    <rewriteMaps>
        <rewriteMap name="map1" defaultValue="(.+)"/>
    </rewriteMaps>
    <rules>
        <rule name="Rewrite rule1 for map1">
        <match url="product/(.+)/(.+)"/>
        <conditions>
            <add input="{map1:{REQUEST_URI}}" pattern="(.+)"/>
        </conditions>
        <action type="Rewrite" url="productdetail.aspx?Product={R:1}" appendQueryString="false" redirectType="Permanent"/>
        </rule>
    </rules>
  </rewrite>

如果你有了解重写机制问题,我建议你阅读这篇文章由Scott Guthrie的。

我想,这应该为你工作给予了IIS 7.0或7.5的环境。



Answer 2:

我跟着这篇文章: 如何:使用路由的Web窗体

之前,我发现我有我的共享主机,没有对当地的问题。 这是我的web.config。

我的主机使用IIS 7集成管道,我错过了这一点:

<handlers>
    <!---after all the others--->       
    <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>

编辑:根据您的设置和代码,唯一剩下的事情就是检查一下,如果你有路由DLL在web.config中定义,并部署到bin目录:

<add assembly="System.Web.Routing, Version=3.5.0.0, 
  Culture=neutral, 
  PublicKeyToken=31BF3856AD364E35"/>


Answer 3:

在你的web.config试试这个。 为我工作。

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>


Answer 4:

只是为了告知什么是我的最终解决方案......在IIS7改变管道模式,以综合和我folowed添加在web.config中的某些行从上面的链接... http://msdn.microsoft.com/en-我们/库/ cc668202.aspx

祝好运。



文章来源: Breaking my head to get Url Routing in IIS 7 hosting environment : ASP.NET