मैं ASP.NET MVC में अपने वेबएप का आधार URL कैसे प्राप्त कर सकता हूं?


300

मैं यह कैसे निर्धारित कर सकता हूं कि मेरे ASP.NET MVC एप्लिकेशन के लिए रूट URL क्या है? Ie, यदि IIS http://example.com/foo/bar पर मेरे एप्लिकेशन की सेवा करने के लिए तैयार है , तो मैं उस URL को विश्वसनीय तरीके से प्राप्त करने में सक्षम होना चाहूंगा जिसमें वर्तमान URL से प्राप्त करना शामिल नहीं है: अनुरोध करें और इसे कुछ नाजुक तरीके से काट लें, जो कि अगर मैं अपनी कार्रवाई को फिर से कर रहा हूं तो टूट जाता है।

आधार URL की आवश्यकता का कारण यह है कि यह वेब एप्लिकेशन किसी अन्य को कॉल करता है जिसे कॉलबैक उद्देश्यों के लिए रूट वेब एप्लिकेशन को रूट की आवश्यकता होती है।

जवाबों:


399

यदि आपके पास अनुरोध वस्तु उपलब्ध है, तो आप इसका उपयोग कर सकते हैं:

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

यदि यह उपलब्ध नहीं है, तो आप इसे संदर्भ के माध्यम से प्राप्त कर सकते हैं:

var request = HttpContext.Current.Request

8
क्या है urlHelper.Content("~")? मैं परिभाषित कैसे बनाऊँ urlHelper? धन्यवाद!
मैक्सिम ज़स्लावस्की

31
@ माक्सिम
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("~"));
पीटर

7
एमवीसी 4 के लिए मैं उपयोग करता हूंControllerContext.RequestContext.HttpContext.Request
पंक्ति 1

7
@Url.Content("~")को हल करता है "/", जो बेस यूआरएल नहीं है।
एंड्रयू हॉफमैन

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 कोर / 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}";
}

आपने यह तरीका कहां रखा है?
जोश डीन

3
यह वास्तव में इस बात पर निर्भर करता है कि आपको इसे कितनी बार उपयोग करने की आवश्यकता है ... यदि यह एकल उपयोग का सौदा है तो इसे केवल उस वर्ग में रखें जहां आपको इस डेटा की आवश्यकता है, यदि आप अपने ऐप में कई वर्गों में इसका उपयोग करने का अनुमान लगाते हैं, तो मैं इसका उपयोग करता हूं फ़ोल्डर Helpersको मेरे ऐप के आधार में कहा जाता है, मेरे पास एक staticवर्ग है जिसे Staticsमैंने बुलाया है और मैंने ऊपर दिए गए कार्यों की तरह काम किया है ... बस सुनिश्चित करें कि आपने ऊपर से public string GetBaseUrl()इसे बदल दिया हैpublic static string GetBaseUrl()
सर्ज सगन

एक अद्यतन के रूप में, मैं अब नामक एक वर्ग का उपयोग नहीं करता हूं Statics, इसके बजाय मैंने इसे अधिक विशिष्ट उपयोगों में तोड़ दिया है, इसलिए इस मामले में यह मेरी UrlHelperकक्षा में जाएगा
सर्ज सगन

1
सभी विकल्पों में से जो मैंने पाया है, यह एकमात्र ऐसा है जो वास्तव में मेरे लिए काम करता है। आपका # २ जो है बहुत बहुत धन्यवाद!
adeldegan

2
अपवोट किया गया है क्योंकि यह PathBase का उल्लेख करने वाला एकमात्र है, जो वास्तव में मुझे चाहिए था। धन्यवाद!
डेव

69

कोड में:

Url.Content("~/");

MVC3 रेजर सिंटैक्स:

@Url.Content("~/")

11
यह रेजर पृष्ठों पर उपयोग करने के लिए ठीक है, लेकिन यदि आप URL को किसी बाहरी स्रोत से पारित करने का प्रयास कर रहे हैं, तो यह आपको पूर्ण URL नहीं देगा।
क्रिलगर

5
यह काम नहीं करता है। यह केवल /वास्तविक नाम के बजाय जोड़ देगा ।
मृकफ

2
कोड Urlआपके पास सही बल्ले के पास उपलब्ध कोड कहां है ? शायद केवल में Controller। निश्चित रूप से नहीं ViewModelया किसी अन्य में classजहां आपको इसकी आवश्यकता हो सकती है ..
सर्ज सगन

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', ...);
Kjell Rilbe

तुम ऐसा क्यों करोगे? बजाय Url.Action फोन करने के लिए?
ब्लैकटाइगरएक्स

4
Azure पर तैनात होने पर काम नहीं करता है। उच्च श्रेणी के उत्तर इस परिदृश्य में काम करते हैं।
जेफ डनलप

25

IIS पर भरोसा करने के साथ चाल यह है कि IIS बाइंडिंग आपके सार्वजनिक URL (WCF मैं आपको देख रहा हूं) से अलग हो सकता है, विशेष रूप से बहु-स्तरीय उत्पादन मशीनों के साथ। मैं बाह्य उद्देश्यों के लिए "बेस" यूआरएल को स्पष्ट रूप से परिभाषित करने के लिए कॉन्फ़िगरेशन का उपयोग करने के लिए वेक्टर की ओर जाता हूं क्योंकि यह अनुरोध ऑब्जेक्ट से निकालने की तुलना में थोड़ा अधिक सफल होता है।


2
लोड बैलेन्सर या परदे के पीछे के सर्वर के लिए भी सही है।
इस्माइल

20

निरपेक्ष आधार URL के लिए इसका उपयोग करें। HTTP और HTTPS दोनों के साथ काम करता है।

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

15

यह MVC में एक asp.net प्रॉपर्टी का रूपांतरण है । यह एक बहुत अधिक सभी गायन है सभी नृत्य रूट यूआरएल विधि प्राप्त करते हैं।

एक सहायक वर्ग घोषित करें:

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

12

MVC _Layout.cshtml में:

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

Thats हम क्या उपयोग करें!

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 के साथ काम करेगा। इसका मतलब है कि आप यूआरएल शुरू कर सकते हैं //
जेस

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 पर दिखती है और यह तय करती है कि होस्ट आईडी के आधार पर किस URL का उपयोग (विकास या लाइव सर्वर) करना है। HttpContext इसे करने के लिए कुछ आसान तरीका भी दे सकता है, लेकिन यह पहला विकल्प है जो मुझे मिला और यह ठीक काम करता है।


3

आप निम्नलिखित स्क्रिप्ट को देखने में उपयोग कर सकते हैं:

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


3

यह ASP .NET MVC 4 में काम कर रहा है। किसी भी नियंत्रक क्रिया में आप लिख सकते हैं: 1stline को संपूर्ण url + क्वेरी स्ट्रिंग मिलती है। दूसरी पंक्ति स्थानीय पथ और क्वेरी निकालें, अंतिम '/' प्रतीक। तीसरी पंक्ति अंतिम स्थिति में '/' प्रतीक जोड़ें।

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

Http://example.com/appAlias/ ... जैसे अप्लायन्स उर्फ ​​के साथ url के लिए : आप यह कोशिश कर सकते हैं:

var req = HttpContext.Current.Request;
string baseUrl = string.Format("{0}://{1}/{2}", req.Url.Scheme, req.Url.Authority, req.ApplicationPath);

3

वेबपेज पर ही:

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

जावास्क्रिप्ट में:

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

यह मेरे एमवीसी प्रोजेक्ट के लिए काम करता है, आशा है कि यह मदद करेगा


@hemp ने इसे संपादित किया, लेकिन इसके लिए वोट नहीं किया? आशा है कि अंक आपके लिए बहुमूल्य हैं
एंड्रयू डे

यह प्रश्न और संबंधित उत्तर मेरे विशेष मुद्दे के लिए मददगार नहीं थे, इसलिए मैंने उनमें से किसी के लिए भी प्रयास या वोट नहीं किया। मैंने इसे संपादित किया क्योंकि मैंने इसे देखा और सोचा कि अगर यह सही ढंग से स्वरूपित किया गया तो यह एक सभ्य जवाब हो सकता है। बस एक अच्छा नागरिक बनने की कोशिश कर रहा हूं।
hemp

साथ ही, किसी उत्तर को संपादित करने के लिए कोई प्रतिष्ठा अंक नहीं मिला है।
भांग


2

शायद यह एक बेहतर उपाय है।

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

का उपयोग करते हुए

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

1
मैंने परीक्षण नहीं किया, लेकिन मुझे संदेह है कि यह तब काम करेगा जब आधार यूआरएल सीधे एक आभासी है। अर्थात। लोकलहोस्ट / मायएप्प
एमरजिंस


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

यह मेरा समाधान था (एक एपीआई नियंत्रक में .net कोर 3.1 का उपयोग करके):

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


0

इसके अलावा आप इस का उपयोग कर सकते हैं। रेजर पृष्ठों के लिए, दूसरों की तुलना में इसका उपयोग करना बेहतर है।

https://ml-software.ch/posts/getting-the-base-url-for-an-asp-net-core-mvc-web-application-in-your-static-javascript-files

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <base href='@Url.AbsoluteContent("~/")'>
    <title>@ViewBag.Title - ASP.NET Core Web Application</title>
    <!-- ... -->
</head>
<body>

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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.