IIS 7ホスティング環境でURLルーティングを取得するために頭を痛めました:ASP.NET
-
05-07-2019 - |
質問
System.Web.Routing を使用してASP.NET URLルーティングを実装しようとしています。そして、これは私のローカルホストでうまくいくようですが、ライブに行くとIIS 7の404エラー(ファイルが見つかりません)が表示されます。参考までに、ホスティングでは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セクションで、次のように1つのルートを定義しました。
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"];
これで私の混乱は終わりです。そして、これはローカルで問題なく動作します。しばらく試してみましたが、今のところ成功しませんでした。
どのヘルプも深く認識されます。
ありがとう...
解決
問題の内容を把握できたかどうかはわかりませんが、まだ解決策を探している場合は、以下を試してください。しばらく前と同じ状況に直面しなければならなかったので、ルーティングメカニズムを必要としないWeb構成の書き換えルールを使用して動作するようにしました。そのため、最初に、ルーティング設定と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の環境があれば機能するはずです。
他のヒント
この記事に従いました: 方法: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>
編集:設定とコードに応じて、web.configでルーティングDLLが定義され、binディレクトリにも展開されているかどうかを確認するだけです。
<add assembly="System.Web.Routing, Version=3.5.0.0,
Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
web.configでこれを試してください。私のために働いた。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
最終的に私の解決策が何であったかを知らせるために... IIS7でパイプラインモードを統合に変更し、上記のリンクからweb.configにいくつかの行を追加しました... http://msdn.microsoft.com/en-us/library/cc668202。 aspx
幸運。