我在ASP.NET应用程序和IIS7上的Dev机器上创建了路由规则,一切正常。当我将解决方案部署到也有IIS7的prod服务器时,我在访问URL时收到错误404(找不到页面)。也许有人可以指出问题出在哪里?
实际错误
HTTP错误404.0 - 未找到 你正在寻找的资源 删除,更改名称,或者是 暂时不可用。详细 错误信息模块IIS Web核心 通知MapRequestHandler 处理程序StaticFile错误代码 0x80070002请求的URL http://xxx.xxx.xxx.xxx:80/pdf-button 物理路径 C:\ www \ pathtoproject \ pdf-button登录 方法匿名登录用户匿名
我的实际代码
<add key="RoutePages" value="all,-forum/"/>
UrlRewrite.Init(ConfigurationManager.AppSettings["RoutePages"]);
public static class UrlRewrite
{
public static void Init(string routePages)
{
_routePages = routePages.ToLower().Split(new[] { ',' });
RegisterRoute(RouteTable.Routes);
}
static void RegisterRoute(RouteCollection routes)
{
routes.Ignore("{resource}.axd/{*pathInfo}");
routes.Ignore("favicon.ico");
foreach (string routePages in _routePages)
{
if (routePages == "all")
routes.MapPageRoute(routePages, "{filename}", "~/{filename}.aspx");
else
if (routePages.StartsWith("-"))
routes.Ignore(routePages.Replace("-", ""));
else
{
var routePagesNoExt = routePages.Replace(".aspx", "");
routes.MapPageRoute(routePagesNoExt, routePagesNoExt, string.Format("~/{0}.aspx", routePagesNoExt));
}
}
}
}
答案 0 :(得分:24)
刚发现下面的行必须添加到web.config
文件中,现在一切都可以在生产服务器上正常工作。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" >
<remove name="UrlRoutingModule"/>
</modules>
</system.webServer>
答案 1 :(得分:11)
解决方案建议
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" >
<remove name="UrlRoutingModule"/>
</modules>
</system.webServer>
可以工作,但会降低性能,甚至可能导致错误,因为现在所有已注册的HTTP模块都在每个请求上运行,而不仅仅是托管请求(例如.aspx)。这意味着模块将在每个.jpg .gif .css .html .pdf等上运行。
更明智的解决方案是在web.config中包含它:
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
</system.webServer>
他的归功于Colin Farr。在http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html点击他关于此主题的帖子。
答案 2 :(得分:2)
我的解决方案,在尝试了一切之后:
部署不当,旧的 PrecompiledApp.config 挂在我的部署位置,并使一切都无法正常工作。
我的最终设置有效:
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/stackoverflow到http://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;
}
}
答案 3 :(得分:1)
对我来说问题是System.Web.Routing版本为3.5的新服务器,而web.config请求版本4.0.0.0。 决议是
%WINDIR%\ Framework \ v4.0.30319 \ aspnet_regiis -i
%WINDIR%\ Framework64 \ v4.0.30319 \ aspnet_regiis -i
答案 4 :(得分:0)
在Windows资源管理器中取消选中此项。
“隐藏已知类型的文件类型扩展名”
答案 5 :(得分:0)
在Global.asax.cs中有这个解决了它。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
}