[asp.net-mvc] URLのドットは、ASP.NET mvcとIISで404を引き起こす


Answers

リラックスしたUrlToFileSystemMappingが私にとってはまったく動作しないことがわかったので、私の場合はRAMMFARをtrueに設定していました。同じことが(.net 4.0 + mvc3)と(.net 4.5 + mvc4)に有効です。

<system.webserver>
    <modules runAllManagedModulesForAllRequests="true">

RAMMFARを設定するとHanselmanがRAMMFARとパフォーマンスについて投稿するときに注意してください

Question

URLにパスにドットが必要なプロジェクトがあります。 たとえば、www.example.com/people/michael.phelpsなどのURLがある可能性があります

ドットのあるURLは404を生成します。私のルーティングは問題ありません。 マイケル・フェルプスを通過すると、ドットなしで、すべてが機能します。 私がドットを追加すると404エラーが出ます。 サンプルサイトはIIS8 ExpressでWindows 7上で動作しています。 URLScanが実行されていません。

私はweb.configに以下を追加しようとしました:

<security>
  <requestFiltering allowDoubleEscaping="true"/>
</security>

残念ながらそれは違いはありませんでした。 404.0見つからないというエラーが表示されます。

これはMVC4プロジェクトですが、それは意味がないと思います。 私のルーティングは正常に動作し、ドットが含まれるまで、私が期待するパラメータはそこにあります。

URLにドットを付けるには何を設定する必要がありますか?




解決策として、シンボルを含まないフォーマットにエンコードすることも考えられます. 、base64として。

jsで追加する必要があります

btoa(parameter); 

コントローラ内

byte[] bytes = Convert.FromBase64String(parameter);
string parameter= Encoding.UTF8.GetString(bytes);



MVC 5.0回避策。

提案された回答の多くは、MVC 5.0では動作しないようです。

最後のセクションの404ドットの問題は、後ろにスラッシュをつけてそのセクションを閉じることで解決できるので、ここで私が使っているクリーンでシンプルな小さなトリックがあります。

便利なプレースホルダをあなたの視点に保ちながら:

@Html.ActionLink("Change your Town", "Manage", "GeoData", new { id = User.Identity.Name }, null)

ジョブを完了させるために少しjquery / javascriptを追加してください:

<script>
    $('a:contains("Change your Town")').on("click", function (event) {
        event.preventDefault();
        window.location.href = '@Url.Action("Manage", "GeoData", new { id = User.Identity.Name })' + "/";
    });</script>

後続のスラッシュに注意してください。

http://localhost:51003/GeoData/Manage/user@foo.com

http://localhost:51003/GeoData/Manage/user@foo.com/



このセクションをWeb.configに追加するだけで、/ {* pathInfo}のすべての要求はpathInfoにドットがある場合でも、指定されたハンドラによって処理されます。 (ServiceStack MVC Host Web.configサンプルとこの回答https://.com/a/12151501/801189から取得)

これはIIS 6と7の両方で機能するはずです。 'add'要素でpath = "*"を変更することで、 'route'の後に別のハンドラを割り当てることができます

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



上記のすべてのソリューションを試してみましたが、どれも私のために働いていませんでした。 何がうまくいったのは、.NETバージョン> 4.5をアンインストールして、多言語バージョンをすべて含んでいたことです。 最終的には、新しいバージョン(英語のみ)を1つずつ追加しました。 私のシステムにインストールされているバージョンは以下の通りです:

  • 2.0
  • 3.0
  • 3.5 4
  • 4.5
  • 4.5.1
  • 4.5.2
  • 4.6
  • 4.6.1

そして、それはまだこの時点で働いています。 4.6.2をインストールするのは恐ろしいことです。

だから私は、4.6.2か、英語版以外のすべてのバージョンが私の設定を乱していたと推測するしかなかった。

HTHの誰か。




1つのWebページでこれを持つ人のための超簡単な答え。 アクションリンクを編集し、アクションリンクの最後に+ / "/"を追加します。

  @Html.ActionLink("Edit", "Edit", new { id = item.name + "/" }) |



Related