ASP.NETアプリケーションとIIS7の開発マシンでルーティングルールを作成しましたが、すべて正常に機能します。 IIS7も備えている製品サーバーにソリューションをデプロイすると、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));
}
}
}
}
以下の行をweb.config
ファイルに追加する必要があることがわかりました。これで、運用サーバーでもすべて正常に動作します。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" >
<remove name="UrlRoutingModule"/>
</modules>
</system.webServer>
提案された解決策
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" >
<remove name="UrlRoutingModule"/>
</modules>
</system.webServer>
は機能しますが、管理されたリクエスト(.aspxなど)だけでなく、すべての登録済みHTTPモジュールがすべてのリクエストで実行されるため、パフォーマンスが低下し、エラーが発生する可能性もあります。これは、モジュールがすべての.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 で、このトピックに関する彼の投稿を確認してください。
すべてを試した後の私の解決策:
悪い展開、古い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;
}
}
私にとっての問題は、web.configがバージョン4.0.0.0を要求したときに、System.Web.Routingがバージョン3.5である新しいサーバーでした。解決策は
%WINDIR%\ Framework\v4.0.30319\aspnet_regiis -i
%WINDIR%\ Framework64\v4.0.30319\aspnet_regiis -i
Global.asax.csでこれを使用すると、解決されました。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
Windowsエクスプローラでこれをオフにします。
「既知のタイプのファイルタイプ拡張子を非表示にする」