it-swarm-id.com

Apa metode terbaik di ASP.NET untuk mendapatkan domain saat ini?

Saya bertanya-tanya apa cara terbaik untuk mendapatkan domain saat ini di ASP.NET?

Contohnya:

http://www.domainname.com/subdir/ harus menghasilkan http://www.domainname.comhttp: //www.sub.domainname .com/subdir / harus menghasilkan http://sub.domainname.com

Sebagai panduan, saya harus dapat menambahkan url seperti "/Folder/Content/filename.html" (katakanlah seperti yang dihasilkan oleh Url.RouteUrl () di ASP.NET MVC) langsung ke URL dan itu akan berfungsi.

98
Matt Mitchell

Jawaban yang sama seperti MattMitchell tetapi dengan beberapa modifikasi. Ini memeriksa port default sebagai gantinya.

Edit: Sintaks yang diperbarui dan menggunakan Request.Url.Authority seperti yang disarankan

$"{Request.Url.Scheme}{System.Uri.SchemeDelimiter}{Request.Url.Authority}"
180
Carlos Muñoz

Per tautan ini titik awal yang baik adalah:

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

Namun, jika domainnya http://www.domainname.com# ini akan gagal.

Sesuatu seperti berikut ini tergoda untuk menyelesaikan ini:

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

Namun, port 80 dan 443 akan tergantung pada konfigurasi.

Dengan demikian, Anda harus menggunakan IsDefaultPort seperti pada Jawaban yang Diterima di atas dari Carlos Muñoz.

37
Matt Mitchell
Request.Url.GetLeftPart(UriPartial.Authority)

Ini termasuk skema.

28
izlence

PERINGATAN! Kepada siapa pun yang menggunakan Current.Request . Url.Host. Memahami bahwa Anda bekerja berdasarkan PERMINTAAN SAAT INI dan bahwa permintaan saat ini tidak SELALU bersama server Anda dan kadang-kadang bisa dengan server lain.

Jadi, jika Anda menggunakan ini dalam sesuatu seperti, Application_BeginRequest () di Global.asax, maka 99,9% dari waktu itu akan baik-baik saja, tetapi 0,1% Anda mungkin mendapatkan sesuatu selain nama Host server Anda sendiri.

Contoh yang baik dari ini adalah sesuatu yang saya temukan belum lama ini. Server saya cenderung untuk memukul http://proxyjudge1.proxyfire.net/fastenv dari waktu ke waktu. Application_BeginRequest () dengan senang hati menangani permintaan ini jadi jika Anda menghubungi Request.Url.Host ketika membuat permintaan ini, Anda akan mendapatkan kembali proxyjudge1.proxyfire.net. Beberapa dari Anda mungkin berpikir "tidak," tetapi patut dicatat karena itu adalah bug yang sangat sulit untuk diperhatikan karena hanya terjadi 0,1% dari waktu: P

Bug ini memaksa saya untuk memasukkan Host domain saya sebagai string di file konfigurasi.

19
Thirlan

Kenapa tidak digunakan

Request.Url.Authority

Ini mengembalikan seluruh domain DAN port.

Anda masih perlu mencari http atau https

13
Korayem

Sederhana dan pendek cara (mendukung skema, domain, dan port):

Gunakan 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
2
RAM

Bagaimana tentang:

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"];
1
Derek Lawless

Cara lain:


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

Menggunakan UriBuilder:

    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();
0
Darren