বর্তমান ডোমেইনটি পাওয়ার জন্য এএসপি.নেটে সেরা পদ্ধতি কোনটি?


102

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

এই ক্ষেত্রে:

http://www.domainname.com/subdir/ উপার্জন করা উচিত http://www.domainname.com http://www.sub.domainname.com/subdir/ পাওয়া উচিত http://sub.domainname.com

গাইড হিসাবে, আমার সরাসরি ইউআরএলটিতে "/ ফোল্ডার / কনটেন্ট / ফাইল ফাইল এইচটিএমএল" (এএসপি.নেট এমভিসি তে Url.RouteUrl () দ্বারা উত্পন্ন হিসাবে বলা হয়েছে) এর মতো একটি url যুক্ত করতে সক্ষম হওয়া উচিত এবং এটির কাজ করা উচিত।


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

1
তাহলে কী "অফিশিয়াল ইউআরএল" (আইআইএস-এর একটি?) পাওয়ার কোনও উপায় আছে
ম্যাট মিচেল

উত্তর:


186

ম্যাটমিচেলের হিসাবে একই উত্তর তবে কিছু পরিবর্তন রয়েছে। পরিবর্তে এটি ডিফল্ট পোর্টের জন্য পরীক্ষা করে।

সম্পাদনা: সিনট্যাক্স আপডেট হয়েছে এবং Request.Url.Authorityপ্রস্তাবিত হিসাবে ব্যবহার করা হচ্ছে

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"

3
আমি। নেট, যে আমি ":" এর পরিবর্তে ব্যবহার করতে পারি তার কোনও ক্ষেত্র আছে? সিস্টেম.উরি.পোর্টডিলিমিটারের মতো কিছু? আপনি জানেন, কেবল ধারাবাহিকতার জন্য। :)
জান আগারার্ড

2
আমি জানি না, জান আগাগার্ড, তবে আপনি সর্বদা স্থানীয়ভাবে এটি তৈরি করতে পারেন। আমি বেশিরভাগ "যাদু" স্ট্রিং এবং সংখ্যার জন্য এটি করি। এই বিষয়টির জন্য, আপনি তারপরে স্ট্রিং ব্যবহার করবেন Car কার্লোসের উত্তরে "" এর পরিবর্তে এমপিটি;)
vbullinger

8
আপনি এবং এর Request.Url.Authorityপরিবর্তে কোরাইম প্রস্তাবিত হিসাবে ব্যবহার করতে পারেন । Request.Url.HostRequest.Url.Port
শমলস

4
স্ট্রাক্টকেটিং স্ট্রিংয়ের পরিবর্তে আপনার সিস্টেম.উরিবিল্ডার ক্লাসটি ব্যবহার করা উচিত।
BrainSlugs83

3
@ ম্যাটমিচেল, এটি কর্তৃপক্ষের সাথে সম্পর্কিত সমস্যাগুলির ভিত্তি নেই বলে মনে হয়, এটি হোস্টের সমতুল্য "": "+ বন্দর, সোর্স কোড ডটনেটফ্রেমওয়ার্ক.আর.ডেফল্ট.এএসপিএক্স
জিউসেপ রোমেনগোলো

40

অনুযায়ী এই লিঙ্কে একটি ভাল আদ্যস্থল হল:

Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 

তবে ডোমেনটি যদি http://www.domainname.com:500 হয় তবে এটি ব্যর্থ হবে।

নীচের মতো কিছু এটি সমাধান করতে লোভনীয়:

int defaultPort = Request.IsSecureConnection ? 443 : 80;
Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host 
  + (Request.Url.Port != defaultPort ? ":" + Request.Url.Port : "");

তবে 80 এবং 443 পোর্টটি কনফিগারেশনের উপর নির্ভর করবে।

যেমন, আপনার উপরের কার্লোস মুউজ থেকে গৃহীত উত্তরIsDefaultPort হিসাবে ব্যবহার করা উচিত ।


1
কেন এখানে পোর্ট 80 ধরে? আপনি যদি এই অনুমানটি সরিয়ে থাকেন তবে কোডটি একটি ক্যাচ-অল-এর মতো দেখাচ্ছে। আপনি যখন 80 বন্দরটি ধরে নিয়েছেন, আপনি অনেক পরিস্থিতিতে ব্যর্থ হয়ে যাবেন (অন্যান্য উত্তরে মন্তব্য দেখুন)। আপনি যদি সম্ভব বন্দর নম্বরটি সরাতে চান তবে আপনার অবশ্যই পরীক্ষা করে নেওয়া উচিত যে পোর্ট নম্বরটি প্রশ্নযুক্ত স্কিমের জন্য ডিফল্ট এবং স্কিমটি ডিফল্ট বন্দর নম্বরগুলি সমর্থন করে।
bzlm

হ্যাঁ নোটটি দেখুন যে 80 পোর্টটি খারাপ ধারণা হতে পারে। আমি এর আশেপাশে অন্য কোনও উপায় জানি না কারণ আমি উল্লেখ করেছি যে এটির কনফিগারেশন নির্ভর হওয়া দরকার।
ম্যাট মিচেল

1
আমি জানি না এটি সাহায্য করবে কি না তবে আপনি চেষ্টাও করতে পারেন: যদি অনুরোধ।আইএসটিএসপি ব্যবহার করা হয় কিনা তা নির্ধারণের জন্য আইসসিকিউর সংযোগ?
এরিক ব্রাউন

1
@ এরিক ব্রাউন - হ্যাঁ, এই উত্তরটি 5 বছর পরে রেট্রোসেক্টে দুর্দান্ত নয়। এই সমস্যাটি এড়াতে আমি কার্লোস মুউজের স্বীকৃত উত্তরটি দিয়ে যাব।
ম্যাট মিচেল

29
Request.Url.GetLeftPart(UriPartial.Authority)

এটি প্রকল্প অন্তর্ভুক্ত করা হয়।


23
তারা এই নামটি নিয়ে এসে আমি সভায় থাকতে চাই
সাইমন_উইভার

20

সতর্কবার্তা! কারেন্ট.রউয়েস্ট ব্যবহার করে এমন কারও কাছে কারও কাছে। বুঝতে হবে আপনি বর্তমান অনুরোধের ভিত্তিতে কাজ করছেন এবং বর্তমান অনুরোধটি সর্বদা আপনার সার্ভারের সাথে থাকবে না এবং কখনও কখনও অন্যান্য সার্ভারের সাথেও থাকতে পারে।

সুতরাং আপনি যদি এটি গ্লোবাল.অ্যাসাক্সের অ্যাপ্লিকেশন_বেগিনআরকোয়েস্ট () এর মতো কিছুতে ব্যবহার করেন তবে 99.9% সময় ঠিক হয়ে যাবে তবে 0.1% আপনি নিজের সার্ভারের হোস্টের নাম বাদে অন্য কিছু পেতে পারেন।

এর একটি ভাল উদাহরণ হ'ল এমন কিছু বিষয় যা আমি খুব বেশি আগে খুঁজে পাইনি। আমার সার্ভার সময় সময় http://proxyjudge1.proxyfire.net/fastenv হিট করতে থাকে । অ্যাপ্লিকেশন_বেগিনআরকিউয়েস্ট () আনন্দের সাথে এই অনুরোধটি পরিচালনা করে তাই আপনি যদি অনুরোধটি কল করেন Uআরুল.হোস্ট যখন এই অনুরোধটি করা হচ্ছে তখন আপনি প্রক্সিজডজ ১.প্রক্সিফায়ারফোনটি ফিরে পাবেন। আপনারা কেউ কেউ "না দুহ" ভাবছেন তবে লক্ষণীয় মূল্যবান কারণ এটি লক্ষ্য করা খুব কঠিন একটি বাগ ছিল যেহেতু এটি কেবল সময়ের 0.1% ঘটেছে: পি

এই বাগটি আমাকে আমার ডোমেন হোস্টকে কনফিগার ফাইলগুলিতে একটি স্ট্রিং হিসাবে sertোকাতে বাধ্য করেছে।


ঠিক একই কাজ করেছেন। আমার ডোমেনটি এখন ওয়েবকনফিগে রয়েছে।
Korayem

আমি মনে করি আমি বুঝতে পেরেছি, যদিও - কেন আপনার সার্ভার প্রক্সিফায়ারে আঘাত করে? এটা কি আপনার সাইট? তবে, সামগ্রিকভাবে, তা বোঝায় - একটি অ্যাপ্লিকেশন-নির্দিষ্ট ইভেন্টের সময় একটি অনুরোধ-নির্দিষ্ট অবজেক্ট ব্যবহার করা খুব ভাল কাজ করতে পারে না। একটি পৃষ্ঠা-জীবন চক্র ইভেন্টের মতো একটি অনুরোধ-সুনির্দিষ্ট ইভেন্টে কি কোনও বিপদ আছে (পেজ.ল্ডড কমপ্লিট ইত্যাদি)?
mlhDev

কেন এটি প্রক্সিফায়ারের সমাধান করছে তা নিয়ে আমি খুব তদন্ত করে দেখিনি। এটি অবশ্যই আমার সাইট নয়, তবে এটি আমার কাছে ইঙ্গিত দিয়েছিল যে কারেন্ট.রেকুয়েস্ট।উর্ল 100% নির্ভরযোগ্য নয়। অনেক গবেষণার পরে আমি এটিও আবিষ্কার করেছিলাম যে একই হোস্টের একাধিক এনআইসি কার্ড, আইপি এবং ডোমেন নামগুলির কারণে আপনার হোস্টের নামটি গতিশীলভাবে নির্ধারণ করা সহজ নয়। আপনার অন্যান্য প্রশ্নের জন্য ম্যাট, আপনি কী বোঝাতে চাইছেন তা সম্পর্কে আমি নিশ্চিত নই: (
থার্লান

সুতরাং এটি কেবল কখনওই অ্যাপ্লিকেশন_বেগিনআউকুয়েস্টে ঘটেছে? আমি দেখতে পাচ্ছি না যে আপনি সম্ভবত কোনও হোস্ট শিরোনাম সেট না করে আইআইএস কীভাবে আপনার অ্যাপ্লিকেশনটিতে এই অনুরোধটি পাঠাতে পারত?
সাইমন_উইভার

@ থার্লান - আমি এই জাতীয় অনুরূপ একটি বিষয়টিকে ডিবাগ করার চেষ্টা করছি। আমি অনুরোধ.উর্ল.হোস্ট এবং 'সাধারণত' ভালভাবে কাজ করে তবে সাবডোমেন পাওয়ার চেষ্টা করছি। সত্যিই কি এই কাছাকাছি আছে? অনুরোধে অন্য কিছু পছন্দ হয়েছে যা সঠিক হতে পারে?
স্কোজোমডেন

14

কেন ব্যবহার করবেন না

Request.Url.Authority

এটি পুরো ডোমেন এবং পোর্টটি দেয়।

আপনার এখনও HTTP বা https চিত্রিত করা দরকার


2
এটিও কাজ করে। "চিত্র" HTTP বা https করতে, simlpy এর আগে "//" রাখুন। সুতরাং উদাহরণস্বরূপ এটি href = "// @ অনুরোধ.আরল.অর্থারিটি ..." হিসাবে পড়তে হবে
এডওয়ার্ড এম

2

সহজ এবং স্বল্প উপায় (এটি স্কিমা, ডোমেন এবং পোর্ট সমর্থন করে):

ব্যবহার Request.GetFullDomain()

// Add this class to your project
public static class HttpRequestExtensions{
    public static string GetFullDomain(this HttpRequestBase request)
    {
        var uri= request?.UrlReferrer;
        if (uri== null)
            return string.Empty;
        return uri.Scheme + Uri.SchemeDelimiter + uri.Authority;
    }
}

// Now Use it like this:
Request.GetFullDomain();
// Example output:    https://www.example.com:5031
// Example output:    http://www.example.com:5031
// Example output:    https://www.example.com

1

অন্য উপায়:


string domain;
Uri url = HttpContext.Current.Request.Url;
domain= url.AbsoluteUri.Replace(url.PathAndQuery, string.Empty);

সহজ কিন্তু সহজ উত্তর!
শিরয়

1

কেমন:

NameValueCollection vars = HttpContext.Current.Request.ServerVariables;
string protocol = vars["SERVER_PORT_SECURE"] == "1" ? "https://" : "http://";
string domain = vars["SERVER_NAME"];
string port = vars["SERVER_PORT"];

0

ইউরিবিল্ডার ব্যবহার:

    var relativePath = ""; // or whatever-path-you-want
    var uriBuilder = new UriBuilder
    {
        Host = Request.Url.Host,
        Path = relativePath,
        Scheme = Request.Url.Scheme
    };

    if (!Request.Url.IsDefaultPort)
        uriBuilder.Port = Request.Url.Port;

    var fullPathToUse = uriBuilder.ToString();

-1

কেমন:

String domain = "http://" + Request.Url.Host

খারাপ নয়, তবে যদি আপনার সাইটে সুরক্ষিত পৃষ্ঠাগুলি থাকে তবে https: // আপনার ডোমেনটি পোর্ট 80 এ হোস্ট না করা হলে কী হবে?
ম্যাট মিচেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.