ASP.NET MVCでWebアプリケーションのベースURLを取得するにはどうすればよいですか?


300

ASP.NET MVCアプリケーションのルートURLをすばやく確認するにはどうすればよいですか?つまり、IISがhttp://example.com/foo/barでアプリケーションを提供するように設定されている場合、そのURLを信頼できる方法で取得できるようにして、現在のURLを壊れやすい方法でリクエストを切り刻み、アクションのルートを変更すると壊れます。

ベースURLが必要なのは、このWebアプリケーションが、コールバックのために呼び出し元のWebアプリケーションへのルートを必要とする別のアプリケーションを呼び出すためです。

回答:


399

利用可能なRequestオブジェクトがあると仮定すると、以下を使用できます。

string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));

利用できない場合は、次のコンテキストでアクセスできます。

var request = HttpContext.Current.Request

8
なにurlHelper.Content("~")?定義を作成するにはどうすればよいurlHelperですか?ありがとう!
Maxim Zaslavsky、2010

31
@Maxim、おそらくUrl.Content( "〜")に
UpTheCreek

13
私が最終的に使用したもの:var request = HttpContext.Current.Request; urlBase = string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, (new System.Web.Mvc.UrlHelper(request.RequestContext)).Content("~"));
Peter

7
私が使用するMVC 4の場合ControllerContext.RequestContext.HttpContext.Request
row1

7
@Url.Content("~")はに解決されますが"/"、これはベースURLではありません。
アンドリューホフマン

114

したがって、ここにリストされているものはどれもうまくいきませんでしたが、いくつかの答えを使用して、私は何かうまくいきました:

public string GetBaseUrl()
{
    var request = HttpContext.Current.Request;
    var appUrl = HttpRuntime.AppDomainAppVirtualPath;

    if (appUrl != "/") 
        appUrl = "/" + appUrl;

    var baseUrl = string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, appUrl);

    return baseUrl;
}

ASP.NET Core / MVC 6の更新:

ASP.NET Core特にコードが深い場合は、このプロセスが少し面倒になります。あなたが得るための2つのオプションがありますHttpContext

1)あなたからそれを渡しますcontroller

var model = new MyClass(HttpContext);

次にmodel

private HttpContext currentContext;

public MyClass(HttpContext currentContext)
{
    this.currentContext = currentContext;
}

2)おそらく、よりきれいな方法は、クラスにそれを注入することです。 Startup:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddTransient<MyClass, MyClass>();
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

次に、次のように注入します。

private HttpContext currentContext;

public MyClass(IHttpContextAccessor httpContextAccessor)
{
    currentContext = httpContextAccessor.HttpContext;
}

どちらの場合も、以下が更新され.NET Core GetBaseUrl()ます。

public string GetBaseUrl()
{
    var request = currentContext.Request;

    var host = request.Host.ToUriComponent();

    var pathBase = request.PathBase.ToUriComponent();

    return $"{request.Scheme}://{host}{pathBase}";
}

この方法をどこに置きましたか?
Josh Dean

3
それは本当にそれを使用する必要がある頻度に依存します...これが1回限りの取引の場合は、このデータを必要とするクラスに配置します。アプリの複数のクラスで使用することが予想される場合は、名前のフォルダHelpers私のアプリのベースには、私がしているstaticクラスと呼ばれStatics、私はそこに上記のような関数を入れて...ちょうどあなたが上から変更させるpublic string GetBaseUrl()までpublic static string GetBaseUrl()
Serjセーガン

更新として、私はと呼ばれるクラスをもう使用しませんStatics。代わりに、それをより具体的な用途に分解しました。この場合、これは私のUrlHelperクラスに入ります
Serj Sagan

1
私が見つけたすべてのオプションの中で、これが実際に私のために働いた唯一のものです。あなたの#2です。本当にありがとう!
アデルデガン

2
PathBaseについて言及したのはこれだけなので、これに賛成しました。ありがとう!
Dave、

69

コード:

Url.Content("~/");

MVC3 Razor構文:

@Url.Content("~/")

11
これはRazorページでの使用には問題ありませんが、URLを外部ソースに渡そうとすると、完全なURLが得られません。
クリルガー14

5
動作しません。/実際の名前の代わりに追加するだけです。
Mrchief

2
コードはどこでUrlすぐに利用できますか?多分だけでController。確かにないViewModelか、他のclassあなたは、この..必要があるかもしれない場所
Serjセーガン

43

多分それはここに投稿された回答の拡張または変更ですが、私は次の行を使用するだけで機能します

Request.Url.GetLeftPart(UriPartial.Authority) + Url.Content("~")

私のパスが:であるときhttp://host/iis_foldername/controller/action
http://host/iis_foldername/


26

次のスニペットは、MVC4でうまく機能し、HttpContext使用可能である必要はありません。

System.Web.HttpRuntime.AppDomainAppVirtualPath

MVC3でも動作するようです。私はそれを使用するjQuery.load()私は呼びたいコントローラとアクションのためのURLを構築するために: $('#myplaceholder').load('@(Html.Raw(HttpRuntime.AppDomainAppVirtualPath))/MyController/MyAction', ...);
チェルRilbe

どうしてそうするか?Url.Actionを呼び出す代わりに?
BlackTigerX 14

4
Azureに展開した場合は機能しません。このシナリオでは、より高い評価の回答が機能します。
ジェフダンロップ

25

IISに依存することの秘訣は、特にマルチホームの本番マシンでは、IISバインディングがパブリックURL(私が見ているWCF)と異なる可能性があることです。私は、外部ベースの目的で「ベース」URLを明示的に定義するために設定を使用する傾向があります。これは、Requestオブジェクトから抽出するよりも少し成功する傾向があるためです。


2
ロードバランサーまたはプロキシの背後にあるサーバーにも当てはまります。
Ishmaeel、2014年

20

絶対ベースURLの場合はこれを使用します。HTTPとHTTPSの両方で動作します。

new Uri(Request.Url, Url.Content("~"))

15

これは、asp.netプロパティからMVCへの変換です。それはほとんどすべての歌うすべてのダンスを取得するルートURLメソッドです。

ヘルパークラスを宣言します。

namespace MyTestProject.Helpers
{
    using System.Web;

    public static class PathHelper
    {
        public static string FullyQualifiedApplicationPath(HttpRequestBase httpRequestBase)
        {
            string appPath = string.Empty;

            if (httpRequestBase != null)
            {
                //Formatting the fully qualified website url/name
                appPath = string.Format("{0}://{1}{2}{3}",
                            httpRequestBase.Url.Scheme,
                            httpRequestBase.Url.Host,
                            httpRequestBase.Url.Port == 80 ? string.Empty : ":" + httpRequestBase.Url.Port,
                            httpRequestBase.ApplicationPath);
            }

            if (!appPath.EndsWith("/"))
            {
                appPath += "/";
            }

            return appPath;
        }
    }
}

使用法:

コントローラから使用するには:

PathHelper.FullyQualifiedApplicationPath(ControllerContext.RequestContext.HttpContext.Request)

ビューで使用するには:

@using MyTestProject.Helpers

PathHelper.FullyQualifiedApplicationPath(Request)

1
これは、サイトが80以外のポートで実行されている可能性を説明する唯一の回答です。他のすべての回答は、私に関する限り安全ではありません。ありがとう!
jebar8 2015年

12

MVC _Layout.cshtml:

<base href="@Request.GetBaseUrl()" />

それが私たちが使うものです!

public static class ExtensionMethods
{
public static string GetBaseUrl(this HttpRequestBase request)
        {
          if (request.Url == (Uri) null)
            return string.Empty;
          else
            return request.Url.Scheme + "://" + request.Url.Authority + VirtualPathUtility.ToAbsolute("~/");
        }
}

を使用するための+1 <base>。また、httpまたはhttpsで動作するように、Schemeを省略できます。つまり、URLをで始めることができます//
Jess

5

これは私にとってもうまくいきます(ロードバランサーでも):

@{
    var urlHelper = new UrlHelper(Html.ViewContext.RequestContext);
    var baseurl = urlHelper.Content(“~”);
}

<script>
    var base_url = "@baseurl";
</script>

特に非標準のポート番号を使用している場合、Request.Url.Authorityの使用は、最初は適切なリードのように見えますが、LB環境では失敗します。


3

HttpContext.Currentを調べ、ホストIDに応じて使用するURL(開発サーバーまたはライブサーバー)を決定する静的メソッドを使用できます。HttpContextを使用すると、もっと簡単な方法が提供されることもありますが、これが最初に見つけたオプションであり、正常に機能します。


3

ビューで次のスクリプトを使用できます。

<script type="text/javascript">
    var BASE_URL = '<%= ResolveUrl("~/") %>';
</script>


3

これはASP .NET MVC 4で機能します。任意のコントローラーアクションで記述できます。1stlineはurl + Query文字列全体を取得します。2行目はローカルパスとクエリ、最後の「/」記号を削除します。3行目は最後の位置に「/」記号を追加します。

Uri url = System.Web.HttpContext.Current.Request.Url;
string UrlLink = url.OriginalString.Replace(url.PathAndQuery,"");
UrlLink = String.Concat(UrlLink,"/" );

3

タグを使用している場合、単純なhtmlおよびASP.NETまたはASP.NET MVCで:

<a href="~/#about">About us</a>


3

ウェブページ自体:

<input type="hidden" id="basePath" value="@string.Format("{0}://{1}{2}",
  HttpContext.Current.Request.Url.Scheme,
  HttpContext.Current.Request.Url.Authority,
  Url.Content("~"))" />

JavaScriptでは:

function getReportFormGeneratorPath() {
  var formPath = $('#reportForm').attr('action');
  var newPath = $("#basePath").val() + formPath;
  return newPath;
}

これは私のMVCプロジェクトで機能します。


@hemp編集しましたが、投票しませんでしたか?ポイントがあなたにとって貴重であることを願っています
Andrew Day

この質問と関連する回答は私の特定の問題には役立たなかったので、私はそれらのいずれにも挑戦したり投票したりしませんでした。私はたまたま見たのでこれを編集しましたが、正しくフォーマットされていればそれはまともな答えかもしれないと思いました。ただ良き市民であろうとしています。
2017年

また、回答を編集することで得られる評判ポイントはありません。


2

多分それはより良い解決策です。

@{
   var baseUrl = @Request.Host("/");
}

を使用して

<a href="@baseUrl" class="link">Base URL</a>

1
私はテストしませんでしたが、ベースURLが直接仮想である場合、これが機能するかどうかは疑問です。すなわち。localhost / myApp
2015


1

以下は私のためにしっかりと働きました

var request = HttpContext.Request;
                        var appUrl = System.Web.HttpRuntime.AppDomainAppVirtualPath;

                        if (appUrl != "/")
                            appUrl = "/" + appUrl + "/";

                        var newUrl = string.Format("{0}://{1}{2}{3}/{4}", request.Url.Scheme, request.UrlReferrer.Host, appUrl, "Controller", "Action");


1

これは私の解決策でした(APIコントローラで.NET Core 3.1を使用):

string baseUrl = $"{Request.Scheme}://{Request.Headers.Where(h => h.Key == "Host").First().Value}";

0

単に1行でBaseUrlを取得します

string baseUrl = new Uri(Request.Url, Url.Content("~")).AbsoluteUri;

//output example: https://stackoverflow.com


0

ユーティリティクラスのようなプロジェクトの静的クラスにこの関数を追加します。

utility.csの内容:

public static class Utility
{
    public static string GetBaseUrl()
    {
        var request = HttpContext.Current.Request;
        var urlHelper = new UrlHelper(request.RequestContext);
        var baseUrl = $"{request.Url.Scheme}://{request.Url.Authority}{urlHelper.Content("~")}";
        return baseUrl;
    }
}

このコードをどこでも使用して楽しんでください:

var baseUrl = Utility.GetBaseUrl();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.