আমি কীভাবে আমার ওয়েব অ্যাপের বেস ইউএসএল এএসপি.নেট এমভিসিতে পেতে পারি?


300

আমার এএসপি.নেট এমভিসি অ্যাপ্লিকেশনের জন্য মূল URL কী তা আমি কীভাবে দ্রুত নির্ধারণ করতে পারি? উদাহরণস্বরূপ, যদি আইআইএসটি http://example.com/foo/bar এ আমার অ্যাপ্লিকেশনটি পরিবেশন করতে প্রস্তুত হয় , তবে আমি সেই ইউআরএলটিকে নির্ভরযোগ্য উপায়ে পেতে সক্ষম হতে চাই যা বর্তমান ইউআরএল থেকে প্রাপ্ত হওয়া জড়িত না অনুরোধ করুন এবং এটিকে কিছু নাজুক উপায়ে কাটাতে চেষ্টা করুন যা আমি আমার ক্রিয়াকে পুনরায় রুটে দিলে বিরতি।

আমার বেস ইউআরএলটির প্রয়োজন হওয়ার কারণটি হ'ল এই ওয়েব অ্যাপ্লিকেশনটিতে কলব্যাকের উদ্দেশ্যে কলার ওয়েব অ্যাপ্লিকেশনটির রুট প্রয়োজন এমন আরও একটি কল রয়েছে।

উত্তর:


399

ধরে নিচ্ছি আপনার কাছে কোনও অনুরোধের অবজেক্ট রয়েছে, আপনি এটি ব্যবহার করতে পারেন:

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

এটি উপলভ্য না হলে আপনি প্রসঙ্গের মাধ্যমে এটিতে যেতে পারেন:

var request = HttpContext.Current.Request

8
কী urlHelper.Content("~")? আমি কীভাবে সংজ্ঞা তৈরি করব urlHelper? ধন্যবাদ!
ম্যাক্সিম জ্যাসলাভস্কি

31
@ ম্যাক্সিম, আপনি সম্ভবত উরল.কন্টেন্ট ("~")
দ্য ক্রিক

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

6
@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;
}

এএসপি.নেট কোর / এমভিসি 6 এর জন্য আপডেট:

ASP.NET Coreএই প্রক্রিয়াটিকে কিছুটা আরও বেদনাদায়ক করে তোলে, বিশেষত যদি আপনি নিজের কোডটিতে গভীর থাকেন। আপনার কাছে পেতে দুটি বিকল্প রয়েছে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()
Serj Sagan

আপডেট হিসাবে, আমি আর বলা ক্লাস ব্যবহার করি না Statics, পরিবর্তে আমি এটি আরও নির্দিষ্ট ব্যবহারে বিভক্ত করে ফেলেছি, তাই এই ক্ষেত্রে এটি আমার UrlHelperক্লাসে চলে যেতে পারে
Serj Sagan

1
আমি যে সমস্ত বিকল্প পেয়েছি তার মধ্যে কেবলমাত্র এটিই আমার পক্ষে কাজ করেছিল। আপনার # 2 এটি। একটি গুচ্ছ ধন্যবাদ!
অ্যাডেলডেগন

2
এটি অগ্রাহ্য করা হয়েছে কারণ কেবলমাত্র প্যাথবেস উল্লেখ করার জন্য এটিই আমার প্রয়োজন। ধন্যবাদ!
ডেভ

69

কোডে:

Url.Content("~/");

এমভিসি 3 রেজার সিনট্যাক্স:

@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

নিম্নলিখিত স্নিপেট এমভিসি 4 এ আমার জন্য দুর্দান্তভাবে কাজ করে এবং এর কোনও উপলব্ধের দরকার নেই HttpContext:

System.Web.HttpRuntime.AppDomainAppVirtualPath

এমভিসি 3 তেও কাজ করার কথা মনে হচ্ছে। আমি jQuery.load()যে কন্ট্রোলার এবং অ্যাকশনটি কল করতে চাইছি তার জন্য ইউআরএল তৈরি করতে আমি এটি ব্যবহার করি : $('#myplaceholder').load('@(Html.Raw(HttpRuntime.AppDomainAppVirtualPath))/MyController/MyAction', ...);
কেজেল রিল্ব

তুমি ওটা কেন করবে? পরিবর্তে url.Action কল?
ব্ল্যাকটাইগারএক্স

4
আজুরে মোতায়েন করার সময় কাজ করে না। উচ্চতর রেটযুক্ত উত্তরগুলি এই পরিস্থিতিতে কাজ করে।
জেফ ডানলপ

25

আইআইএসের উপর নির্ভর করার কৌশলটি হ'ল আইআইএস বাইন্ডিংগুলি আপনার সর্বজনীন ইউআরএল (ডাব্লুসিএফ আমি আপনাকে দেখছি) থেকে আলাদা হতে পারে, বিশেষত মাল্টি-হোমড প্রোডাকশন মেশিনগুলির সাথে। আমি বাহ্যিক উদ্দেশ্যে স্পষ্টভাবে "বেস" ইউআরএল সংজ্ঞায়িত করার জন্য কনফিগারেশন ব্যবহারের দিকে ভেক্টরের ঝোঁক রাখি কারণ এটি অনুরোধ অবজেক্ট থেকে এটি বের করার চেয়ে কিছুটা বেশি সফল হতে থাকে।


2
লোড ব্যালান্সার বা প্রক্সিগুলির পিছনে সার্ভারগুলির ক্ষেত্রেও এটি সত্য।
ইসমাইল

20

একটি নিখুঁত বেস URL এর জন্য এটি ব্যবহার করুন। এইচটিটিপি এবং এইচটিটিপিএস উভয় দিয়েই কাজ করে।

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

15

এটি এমভিসিতে একটি এএসপিএন সম্পত্তি রূপান্তর । এটি বেশ সুন্দর সমস্ত গানে সমস্ত নৃত্যের রুট 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 এর বাইরে অন্য কোনও বন্দরে কোনও সাইট চলার সম্ভাবনার জন্য অ্যাকাউন্ট করে accounts আমি যতটা উদ্বিগ্ন অন্যান্য উত্তরগুলি সবই অনিরাপদ। ধন্যবাদ!
jebar8

12

এমভিসি _ লেআউট.কোশটিএমএলে:

<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 এর সাথে কাজ করবে। এর অর্থ আপনি ইউআরএলটি দিয়ে শুরু করতে পারেন //
জেস 19

5

এটি আমার পক্ষে ভাল কাজ করে (লোড ব্যালান্সারের সাথেও):

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

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

বিশেষত যদি আপনি অনুরোধ ব্যবহার করে অ-মানক বন্দর নম্বর ব্যবহার করেন r


3

আপনার কাছে একটি স্থিতিশীল পদ্ধতি থাকতে পারে যা HTTPContext.Corse এ দেখায় এবং হোস্ট আইডির উপর নির্ভর করে কোন URL টি (বিকাশ বা লাইভ সার্ভার) ব্যবহার করতে হবে তা স্থির করে। এইচটিপিপেক্সটেক্সট এমনকি এটি করার কিছু সহজ উপায়ও সরবরাহ করতে পারে তবে এটি আমার প্রথম বিকল্প এবং এটি কার্যকরভাবে কাজ করে works


3

আপনি নিম্নলিখিত স্ক্রিপ্টটি দেখতে ব্যবহার করতে পারেন:

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


3

এটি এএসপি। নেট এমভিসি 4 এ কাজ করছে যে কোনও নিয়ামক ক্রিয়ায় আপনি লিখতে পারেন: 1 ম লাইন পুরো url + ক্যোরি স্ট্রিং পেয়েছে। ২ য় লাইন স্থানীয় পথ এবং ক্যোয়ারী, সর্বশেষ '/' চিহ্ন সরিয়ে দেয় তৃতীয় লাইনটি শেষ অবস্থানে '/' চিহ্ন যোগ করুন।

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

3

আপনি যদি এইচটিএমএল এবং এএসপি.এনইটি বা এএসপি.নেট এমভিসি তে ট্যাগ ব্যবহার করছেন:

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

3

অ্যাপলিকেশন ওরফে ইউআরএল এর জন্য যেমন http://example.com/appAlias/ ... আপনি এটি চেষ্টা করতে পারেন:

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

এটি আমার এমভিসি প্রকল্পের জন্য কাজ করে, আশা করি এটি সাহায্য করবে


@ হেম্প এডিট করেছেন কিন্তু ভোট দেননি? আশা করি পয়েন্টগুলি আপনার কাছে মূল্যবান
অ্যান্ড্রু ডে

এই প্রশ্নটি এবং সম্পর্কিত উত্তরগুলি আমার নির্দিষ্ট সমস্যার জন্য সহায়ক ছিল না তাই আমি চেষ্টা করেছিলাম বা তাদের কোনওটির পক্ষে ভোট দিয়েছি না। আমি এটি সম্পাদনা করেছি কারণ আমি এটি দেখতে পেয়েছি এবং ভেবেছিলাম এটি সঠিকভাবে উত্তর হতে পারে যদি এটি সঠিকভাবে ফর্ম্যাটেড হয়। শুধু একজন ভাল নাগরিক হওয়ার চেষ্টা করছি।
শণ

এছাড়াও, উত্তর সম্পাদনার জন্য কোনও খ্যাতিমান পয়েন্ট নেই।
শণ


2

হতে পারে এটি আরও ভাল সমাধান।

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

ব্যবহার

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

1
আমি পরীক্ষা করিনি, তবে বেস ইউআরএলটি সরাসরি ভার্চুয়াল হলে এটি কাজ করবে সন্দেহ doubt অর্থাত। লোকালহোস্ট / মাইএপ


1

নিম্নলিখিতগুলি আমার পক্ষে দৃ worked়ভাবে কাজ করেছিল

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

এটি আমার সমাধান ছিল (একটি এপিআই নিয়ন্ত্রণকারীতে। নেট কোর 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

ইউটিলিটি ক্লাসের মতো প্রকল্পে স্থির শ্রেণিতে এই ফাংশনটি যুক্ত করুন:

ইউটিলিটি.সিএস সামগ্রী:

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.