মাইক্রোসফ্ট.এএসপনেট.এইচটিপি.এইচটিপিআরকোয়েস্ট থেকে কাঁচা ইউআরএল পান


89

HttpRequestAsp.Net 5 (vNext) এ বর্গ যেমন অনুরোধ জন্য URL সম্পর্কে পার্স বিবরণ, (অন্যান্য বিষয়ের মধ্যে) রয়েছে Scheme, Host, Pathইত্যাদি

আমি এখনও কোথাও সন্ধান পাইনি যা মূল অনুরোধের URL প্রকাশ করে - কেবলমাত্র এই পার্সড মানগুলি। (পূর্ববর্তী সংস্করণে ছিল Request.Uri)

এইচটিটিপিআরকুয়েস্টে উপলভ্য উপাদানগুলি থেকে একসাথে টুকরো টুকরো না করে আমি কী কাঁচা ইউআরএল ফিরে পেতে পারি?


4
এটি সম্পর্কে একটি বাগ আগে দায়ের করা হয়েছে বলে মনে হচ্ছে তবে এটি বন্ধ রয়েছে ... আপনি সম্ভবত এটির বিশদটি পরীক্ষা করতে পারেন এবং আপনি যদি এটি সম্পর্কে দৃ feel় বোধ
কিরণ চালা

@ কিরানচাল্লা: আমি তাদের মতামতকে বাছাই করি, যদিও এটি আমাকে বিস্মিত করে তোলে যে তখনকার সংস্করণগুলিতে রাওআরএল কী ছিল। আমি অনুমান করি যে তারা বর্তমানে স্কিমটি সম্পর্কে কী দেখায়, হোস্ট ইত্যাদিকে অনুরোধের সার্ভার সাইড হ্যান্ডলিং থেকে আলাদা করা যায়, এবং অনুরোধটিতে নিজেই কিছুই নয়।
জন এগারটন

আপনি কি টসস্ট্রিং () চেষ্টা করেছেন?
আগুয়া

উত্তর:


85

দেখে মনে হচ্ছে আপনি এটি সরাসরি অ্যাক্সেস করতে পারবেন না, তবে আপনি ফ্রেমওয়ার্কটি ব্যবহার করে এটি তৈরি করতে পারেন:

Microsoft.AspNetCore.Http.Extensions.UriHelper.GetFullUrl(Request)

উপরেরটি আপনি এক্সটেনশন পদ্ধতি হিসাবেও ব্যবহার করতে পারেন।

এটি একটি stringপরিবর্তে পরিবর্তিত হয় Uri, তবে এটির উদ্দেশ্যটি কার্যকর করা উচিত! (এটিও এতে ভূমিকা রাখবে বলে মনে হয় UriBuilder))

এটি নিখোঁজের পরিবর্তে কেবল রিফ্যাক্টর করা হয়েছে বলে ইঙ্গিত করার জন্য @ এমএসভিটেলিকাকে ধন্যবাদ! এবং আমার উত্তরে নাম স্থান পরিবর্তনটি নির্দেশ করতে @ সিএফ-তেও!


4
এটি আর বিটা -5 হিসাবে কাজ করে না। আমার কাছে ভাল বিকল্প নেই বা আমার উত্তর আপডেট করতে হবে।
ম্যাট ডেক্রে

13
আমি বিশ্বাস করি এটি সত্যিকারের এক্সটেনশন পদ্ধতিতে তৈরি হয়েছিল - আপনি কেবল নিজের ব্যবহারের ক্ষেত্রে নির্ভর করে নেমস্পেসটি আমদানি করেন এবং কল করেন GetEncodedUriবা হয় or GetDisplayUri
dlras2

43
মাইক্রোসফ্ট.এএসপনেট.এইচটিপি. এক্সটেনশনগুলি ব্যবহার করে; এবং সেই অনুরোধ.গেটডিসপ্লে ইউল ()
এমএসউইট্লিক্লি

8
ডান নেমস্পেসটি এখন মাইক্রোসফ্ট.এস্পনেটকোর.হট্ট্প.এক্সটেনশনস
সিএফ

9
এএসপি.নেট কোর ১.০ এর জন্য আপনার রেজার ভিউতে "মাইক্রোসফ্ট.এএসপনেটকোর.হট্ট্প.এক্সটেনশনস" ব্যবহার করে যুক্ত করুন। Url পেতে "@ Context.Request.GetDisplayUrl ()" ব্যবহার করুন।
Joop

75

নুগেট প্যাকেজ যুক্ত / ব্যবহার করুন:

using Microsoft.AspNetCore.Http.Extensions; 

(এএসপি.নেট কোর আরসি 1 এ এটি মাইক্রোসফ্টে ছিল।

তারপরে আপনি সম্পাদন করে সম্পূর্ণ http অনুরোধ url পেতে পারেন:

var url = httpContext.Request.GetEncodedUrl();

বা

var url = httpContext.Request.GetDisplayUrl();

উদ্দেশ্য উপর নির্ভর করে।


এএসপি.নেট কোর আরসি 2 এখন পাওয়া যায়?
সের্গেই জি।


উত্সের দিকে তাকিয়ে, এগুলি কিছু এনকোডিং / ডিকোডিং স্পষ্ট করে তাই এটি কাঁচা url হবে না not এছাড়াও, আইএসআইএস কখনও কখনও ইউআরএলটি কেস্ট্রল যেমন% 2F -> / এ যাওয়ার আগে পরিবর্তিত হয়।
ড্যানিয়েল লিচ

4
@ টমস্টিকেল আপনি কী সম্পর্কে কথা বলছেন তা নিশ্চিত নয় ... তাদের কোনওটিই ব্যবহার করে আমার কোনও সমস্যা হয়নি। usingউত্তরটিতে বর্ণিত হিসাবে আপনার কাছে ফাইলের নির্দেশিকা রয়েছে কিনা তা নিশ্চিত করুন , কারণ এগুলি "সাধারণ" পদ্ধতি নয়, বরং এক্সটেনশন পদ্ধতি রয়েছে।
নিক মার্টিন

4
টমস্টিকেল মেলা মাইক্রোসফ্ট.এএসপনেটকোর.এএসপি.নেট কোর ২.২ এর জন্য ইনস্টল করা সমস্ত প্যাকেজটি (২.০-এও পরীক্ষিত) এটি আমার পক্ষে ভাল কাজ করে।
নিক মার্টিন

16

আপনি যদি সত্যিই চান প্রকৃত, কাঁচা URL টি , আপনি নিম্নলিখিত এক্সটেনশনটি পদ্ধতি ব্যবহার করতে পারে:

public static class HttpRequestExtensions
{
    public static Uri GetRawUrl(this HttpRequest request)
    {
        var httpContext = request.HttpContext;

        var requestFeature = httpContext.Features.Get<IHttpRequestFeature>();

        return new Uri(requestFeature.RawTarget);
    }
}

এই পদ্ধতিটি RawTargetঅনুরোধটির সদ্ব্যবহার করে যা HttpRequestবস্তুটিতেই প্রকাশিত হয় না । এই সম্পত্তিটি এএসপি.এনইটি কোরের 1.0.0 প্রকাশে যুক্ত করা হয়েছিল। আপনি এটি বা আরও নতুন সংস্করণ চালাচ্ছেন তা নিশ্চিত করুন।

বিঃদ্রঃ! এই সম্পত্তিটি কাঁচা ইউআরএল উন্মোচিত করে , তাই ডকুমেন্টেশনের দ্বারা উল্লিখিত হিসাবে এটি ডিকোড করা হয়নি:

এই সম্পত্তিটি রাউটিং বা অনুমোদনের সিদ্ধান্তের জন্য অভ্যন্তরীণভাবে ব্যবহৃত হয় না। এটি আরলডিকোড করা হয়নি এবং এর ব্যবহারে যত্ন নেওয়া উচিত।


আমি পুরো। নেট ফ্রেমওয়ার্ক সহ এএসপি। নেট কোর ব্যবহার করছি। এটি আমার পক্ষে কাজ করে না বলে মনে হয় ( RawTargetএটি সংজ্ঞায়িত নয় IHttpRequestFeature)। আপনি কি বিকল্পের কথা ভাবতে পারেন?
টম হেবলবাউর

4
RawTarget1.0 প্রকাশে যোগ করা হয়েছিল, মে মাসে ফিরে । আপনি কি নিশ্চিত যে আপনি সর্বশেষতম সংস্করণে চলছে?

4
যদি আইআইএস ব্যবহার করে হোস্টিং করা হয় তবে আইআইএস কখনও কখনও ইউআরএলটি কেষ্টরলে যাওয়ার আগে বদলে যাবে। এর একটি উদাহরণ% 2F হ'ল / এ ডিকোড হয়ে যায়।
ড্যানিয়েল লিচ

এটি এখন পর্যন্ত অনুমোদনের উত্তর।
ক্রিস মেরিসিক

এটি পুরো URL টির পরিবর্তে URL টি রাস্তায় উপস্থিত হতে পারে
আইইন বালার্ড

12

ইন নেট কোর রেজার:

@using Microsoft.AspNetCore.Http.Extensions
@Context.Request.GetEncodedUrl() //Use for any purpose (encoded for safe automation)

আপনি দ্বিতীয় লাইনের পরিবর্তে ব্যবহার করতে পারেন:

@Context.Request.GetDisplayUrl() //Use to display the URL only

9

অন্যান্য সমাধানগুলি আমার প্রয়োজনগুলি যথাযথভাবে মাপসই করে না কারণ আমি সরাসরি কোনও URIবস্তু চেয়েছিলাম এবং আমি মনে করি যে এই ক্ষেত্রে স্ট্রিং কনটেনটেশন (এও) এড়ানো ভাল তবে আমি ব্যবহারের চেয়ে এই এক্সটেনশন পদ্ধতিগুলি তৈরি করেছি UriBuilderএবং ইউআরএল এর সাথেও কাজ করি http://localhost:2050:

public static Uri GetUri(this HttpRequest request)
{
    var uriBuilder = new UriBuilder
    {
        Scheme = request.Scheme,
        Host = request.Host.Host,
        Port = request.Host.Port.GetValueOrDefault(80),
        Path = request.Path.ToString(),
        Query = request.QueryString.ToString()
    };
    return uriBuilder.Uri;
}

4
ভাল একটা. এছাড়াও আমি solutionচ্ছিক পরামিতিগুলির সাথে আপনার সমাধানকে উন্নত করেছি। সুতরাং আমি ইউআরআইয়ের কোন অংশটি পুনরুদ্ধার করতে চাই তা নিয়ন্ত্রণ করতে পারি। উদাহরণস্বরূপ, কোয়েরি স্ট্রিং ইত্যাদি ব্যতীত কেবল বা সম্পূর্ণ পথ হোস্ট করুন
ব্যবহারকারী 3172616

@ ব্যবহারকারী3172616 দুর্দান্ত ধারণা!
জিয়ম্মিন

4
(80)হওয়া উচিত (-1)। যখন আপনার "হোস্ট" শিরোনামে বাদ দেওয়া পোর্ট সহ https টি স্কিম থাকবে তখন এটি ভুল উরি তৈরি করবে (উদাহরণস্বরূপ https://myweb:80/, (-1)এটি হবে https://myweb)।
ইগর ড্রইআইইচ

4

নিম্নলিখিত বিস্তৃত পদ্ধতিটি প্রাক-বিটা 5 থেকে লজিকটি পুনরুত্পাদন করে UriHelper:

public static string RawUrl(this HttpRequest request) {
    if (string.IsNullOrEmpty(request.Scheme)) {
        throw new InvalidOperationException("Missing Scheme");
    }
    if (!request.Host.HasValue) {
        throw new InvalidOperationException("Missing Host");
    }
    string path = (request.PathBase.HasValue || request.Path.HasValue) ? (request.PathBase + request.Path).ToString() : "/";
    return request.Scheme + "://" + request.Host + path + request.QueryString;
}

3

এই এক্সটেনশনটি আমার পক্ষে কাজ করে:

মাইক্রোসফ্ট.এস্পনেটকোর.এইচটিটিপি ব্যবহার করে;

    public static class HttpRequestExtensions
    {
        public static string GetRawUrl(this HttpRequest request)
        {
            var httpContext = request.HttpContext;
            return $"{httpContext.Request.Scheme}://{httpContext.Request.Host}{httpContext.Request.Path}{httpContext.Request.QueryString}";
        }
    }

0

এএসপি.নেট 5 বিটা 5 এ:

Microsoft.AspNet.Http.Extensions.UriHelper.Encode(
    request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.