2012-02-14 17 views
34

私は以下の問題で私を助けてくれることを願っています。ASP.NET MVC URL(ドット)をサポートするルート

私はIIS7でASP.NET MVC 3を使用しています。私のアプリケーションではドットでユーザー名をサポートしたいと考えています。

例:http://localhost/john.lee

これは私のGlobal.asaxのは、どのように見えるかです:私は

など http://localhost/john.lee/detailsなどの他のページなどにアクセスすると( http://localhost/ {ユーザー名})

routes.MapRoute(
    "UserList", 
    "{username}", 
    new { controller = "Home", action = "ListAll" } 
); 

のアプリケーションが動作します

しかし、メインのユーザーページが動作しない、私はhttp://www.facebook.com/john.leeがサポートされているFacebookのように動作するようにアプリをしたいと思います。

私はコードの下に使用し、それがすべてで私のために動作しませんでした:

<httpRuntime relaxedUrlToFileSystemMapping="true" /> 

私はドットを受け入れるために、コードの下に使用して、アプリを取得することができましたが、私は間違いなく以下を使用したくありません多くの異なった理由のためのコード、この問題を克服する方法があることを教えてください。

<modules runAllManagedModulesForAllRequests="false" /> 
+0

http://stackoverflow.com/questions/8163401/dot-symbol-in-url –

+1

私は同じ問題を持っていますが、IIS 6 –

+1

に私は問題を再現することができません。それは私のためにIIS Expressで動作します(IIS 7.0でも動作するはずです)。また、 '/ john.lee/details'という形式のURLを示しているようですが、あなたのルート定義によれば、アクションを指定することはできません。これは常に 'ListAll'アクションを使用します。だから問題は本当にここのドットとは関係がありません。それはおそらくあなたのルートの詳細です。 –

答えて

0

ここでドットは問題ではないと思います。 AFAIKユーザー名に含めるべきではない唯一の文字は、/

です。john.lee/detailsと一致するルートが表示されていないと、何が間違っているのは難しいですが、URLに一致する別のルートがあると推測していますユーザーの詳細のルートが正しく照合されない

Glimpseのようなツールを使用して、どのルートがマッチしているか把握することをお勧めします。

56

UrlRoutingHandlerをweb.configに追加します。これには、あなたのURLが少し具体的であることが必要です(f.e. /Users/john.lee)。 これはと/ MVC URLとして処理されるべきユーザー始まるすべてのURLを強制的に:

<system.webServer>  
    <handlers>  
    <add name="UrlRoutingHandler" 
     type="System.Web.Routing.UrlRoutingHandler, 
       System.Web, Version=4.0.0.0, 
       Culture=neutral, 
       PublicKeyToken=b03f5f7f11d50a3a" 
     path="/Users/*" 
     verb="GET"/>  
    </handlers> 
</system.webServer> 
+0

私のAPIコントローラにはこれが必要でしたが、それは魅力的でした! – batzen

+0

非常に洗練されたソリューション。ありがとう! –

+0

ありがとう!私はこれを使ってhttp://stackoverflow.com/questions/11728846/dots-in-url-causes-404-with-asp-net-mvc-and-iisとhttp://stackoverflow.com/を解決することができました。質問/ 9331516/asp-net-mvc-routing-add-html-extension-to-routes – user1454265

4

ただ、Web.configファイルにこのセクションを追加し、ルート/ {*パス情報}へのすべての要求が指定によって処理されますpathInfoにドットがある場合でも、これは、IIS 6 & 7の両方のために働くべきである(ServiceStack MVCホストweb.configの例とこの回答https://stackoverflow.com/a/12151501/801189から採取された)

あなたに=「*」パスを変更することにより、「ルート」の後に異なるパスに特定のハンドラを割り当てることができ要素を「追加」

<location path="route"> 
    <system.web> 
     <httpHandlers> 
     <add path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" /> 
     </httpHandlers> 
    </system.web> 
    <!-- Required for IIS 7.0 --> 
    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
     <validation validateIntegratedModeConfiguration="false" /> 
     <handlers> 
     <add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" /> 
     </handlers> 
    </system.webServer> 
    </location> 
+2

これは、System.Web.Routing.UrlRoutingHandlerを使用するだけでなく、うまくいくようです - どちらが優れているか効率が良いかわかりません - UrlRoutingHandlerはルーティングに特化しているようです。 – Ripside

+0

誰かがTransferRequestHandlerとUrlRoutingHandlerの実際の違いは何だと説明できますか?どちらを選ぶべきですか? – Sergey

+0

誰もまだ2017年にIIS7スタックを使用していますか? .NET CoreとKestrelの方がはるかに優れています! –