1. ホーム
  2. c#

[解決済み] ASP.NET MVCのアクションからの絶対URLの取得

2023-07-20 08:46:44

質問

これはおそらくダミーの質問ですが、私は明確な指示を見つけることができません。私はMVC3ウェブアプリケーションにPOCOクラスを持っており、その唯一の目的は、サーバー内のいくつかのファイルのバックアップを管理することです。通常、それはバックアップを作成し、ファイル名をコントローラに返し、コントローラはそれをダウンロードするためのURLを含む電子メールを送信します。これは問題なく動作しますが、送信される絶対的なURLを構築することができません。どの関数を使っても、次のような相対的なURLになってしまいます。 /Backup/TheFile.zip のような相対 URL が得られます。 のような相対的なURLを取得します。 http://www.somesite.com/Backup/TheFile.zip . 試してみました。

VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip");
HttpRuntime.AppDomainAppVirtualPath + "/Backup/SomeFile.zip";
Url.Content("~/Backup/SomeFile.zip");

のようなものを返しますが、これらはすべて /Backup/SomeFile.zipのようになります。 . 何か思い当たることはありますか?

どのように解決するのですか?

以下の方法で行うことができます。

var urlBuilder =
    new System.UriBuilder(Request.Url.AbsoluteUri)
        {
            Path = Url.Action("Action", "Controller"),
            Query = null,
        };

Uri uri = urlBuilder.Uri;
string url = urlBuilder.ToString();
// or urlBuilder.Uri.ToString()

の代わりに Url.Action() の代わりに、このサンプルでは Url.Content() などのルーティングメソッドや、単にパスを渡すこともできます。

しかし、もし URL が Controller Action になるのであれば、もっとコンパクトな方法があります。

var contactUsUriString =
    Url.Action("Contact-Us", "About",
               routeValues: null /* specify if needed */,
               protocol: Request.Url.Scheme /* This is the trick */);

ここでのコツは、一度 protocol /scheme を指定すると、絶対的な URL が得られるということです。 可能であれば、これをお勧めします しかし、必要であれば、最初の例でより一般的な方法も持っています。

詳しくはこちらのブログで書いています。

http://gurustop.net/blog/2012/03/23/writing-absolute-urls-to-other-actions-in-asp-net-mvc/

より抜粋 Meligy's AngularJS & Web Dev Goodies ニュースレター