asp.net-mvc core app_offline - URLのドットは、ASP.NET mvcとIISで404を引き起こす
リラックスしたUrlToFileSystemMappingが私にとってはまったく動作しないことがわかったので、私の場合はRAMMFARをtrueに設定していました。同じことが(.net 4.0 + mvc3)と(.net 4.5 + mvc4)に有効です。
<system.webserver>
<modules runAllManagedModulesForAllRequests="true">
RAMMFARを設定するとHanselmanがRAMMFARとパフォーマンスについて投稿するときに注意してください
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にドットを付けるには何を設定する必要がありますか?
このセクションを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>
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/
ピリオドの代わりにダッシュを使用することを考えたいと思うかもしれません。
Pro ASPのMVC 3フレームワークでは、フレンドリーなURLを作成する方法について提案しています。
シンボル、コード、文字シーケンスは避けてください。 単語セパレータが必要な場合は、ダッシュ(/ my-great-article)を使用します。 アンダースコアは非友好的でURLエンコードされたスペースは奇妙です(/ my + great +記事)または嫌です(/ my%20great%20article)。
また、URLは、人間にとって読みやすく、変更しやすいものでなければならないと述べています。 たぶん、ドットの代わりにダッシュを使うことを考える理由は、同じ本からも得られます。
HTMLページ(.aspxまたは.mvc)にはファイル名拡張子を使用しないでください。特殊ファイルタイプ(.jpg、.pdf、.zipなど)には使用しないでください。 MIMEタイプを適切に設定すると、Webブラウザはファイル名の拡張子を気にしませんが、PDFファイルの終わりは.pdf
ですから、期間は人間にはまだ読める(ただし、ダッシュ、IMOよりも読みにくいですが)、期間の後に何が来るのかによってはまだ混乱している/誤解を招くかもしれません。 誰かが郵便番号の姓を持っていたら? URLは、/ John-zipの代わりに/John.zipになります。これは、アプリケーションを作成した開発者でさえ誤解を招く可能性があります。
上記のすべてのソリューションを試してみましたが、どれも私のために働いていませんでした。 何がうまくいったのは、.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の誰か。
https://.com/a/13082446/1454265でソリューションを使用して、この問題の特定のバージョンを解決することができました(/ customer.html / customerへのルート、後続のスラッシュは許可されていなかった) = "*。html"。
Web.configアーカイブにURL書き換えルールを追加します。 URL書き換えモジュールをIISにインストールしておく必要があります。 あなた自身のインスピレーションとして、次の書き換えルールを使用してください。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Add trailing slash for some URLs" stopProcessing="true">
<match url="^(.*(\.).+[^\/])$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Redirect" url="{R:1}/" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace WebApplication1.Controllers
{
[RoutePrefix("File")]
[Route("{action=index}")]
public class FileController : Controller
{
// GET: File
public ActionResult Index()
{
return View();
}
[AllowAnonymous]
[Route("Image/{extension?}/{filename}")]
public ActionResult Image(string extension, string filename)
{
var dir = Server.MapPath("/app_data/images");
var path = Path.Combine(dir, filename+"."+ (extension!=null? extension:"jpg"));
// var extension = filename.Substring(0,filename.LastIndexOf("."));
return base.File(path, "image/jpeg");
}
}
}