Saya benar-benar baru di ASP.NET MVC stack, dan saya bertanya-tanya apa yang terjadi pada objek Halaman sederhana dan objek Request ServerVariables?
Pada dasarnya, saya ingin mengeluarkan alamat IP PC klien, tetapi saya gagal memahami bagaimana struktur MVC saat ini telah mengubah semua ini.
Sejauh yang saya bisa mengerti, sebagian besar objek variabel telah digantikan oleh varian HttpRequest .
Adakah yang mau berbagi beberapa sumber daya? Benar-benar ada banyak hal untuk dipelajari di dunia ASP.NET MVC. :)
Sebagai contoh, saya memiliki kelas statis dengan fungsi ini. Bagaimana cara mendapatkan hasil yang sama menggunakan ASP.NET MVC?
public static int getCountry(Page page)
{
return getCountryFromIP(getIPAddress(page));
}
public static string getIPAddress(Page page)
{
string szRemoteAddr = page.Request.ServerVariables["REMOTE_ADDR"];
string szXForwardedFor = page.Request.ServerVariables["X_FORWARDED_FOR"];
string szIP = "";
if (szXForwardedFor == null)
{
szIP = szRemoteAddr;
}
else
{
szIP = szXForwardedFor;
if (szIP.IndexOf(",") > 0)
{
string [] arIPs = szIP.Split(',');
foreach (string item in arIPs)
{
if (!isPrivateIP(item))
{
return item;
}
}
}
}
return szIP;
}
Dan bagaimana saya memanggil fungsi ini dari halaman pengontrol?
c#
asp.net-mvc
melaos
sumber
sumber
Jawaban:
Jawaban sederhananya adalah dengan menggunakan properti HttpRequest.UserHostAddress .
Contoh: Dari dalam Kontroler:
Contoh: Dari dalam kelas pembantu:
TETAPI, jika permintaan telah diteruskan oleh satu, atau lebih, server proxy , maka alamat IP yang dikembalikan oleh HttpRequest.UserHostAddress properti akan menjadi alamat IP dari server proxy terakhir yang menyampaikan permintaan.
Server proxy MUNGKIN menggunakan standar de facto menempatkan alamat IP klien di header X-Forwarded-For HTTP. Selain tidak ada jaminan bahwa permintaan memiliki header X-Forwarded-For, juga tidak ada jaminan bahwa X-Forwarded-For belum SPOOFED .
Jawaban Asli
Kode di atas memberikan alamat IP Klien tanpa harus mencari koleksi. Properti Permintaan tersedia dalam Pengendali (atau Tampilan). Karena itu alih-alih meneruskan kelas Halaman ke fungsi Anda, Anda dapat melewati objek Permintaan untuk mendapatkan hasil yang sama:
sumber
Request.ServerVariables["REMOTE_ADDR"]
harus bekerja - baik secara langsung dalam tampilan atau di badan metode tindakan kontroler (Permintaan adalah properti dari kelas Controller di MVC, bukan Halaman).Ini berfungsi .. tetapi Anda harus menerbitkan pada IIS nyata bukan yang virtual.
sumber
Banyak kode di sini sangat membantu, tetapi saya membersihkannya untuk keperluan saya dan menambahkan beberapa tes. Inilah yang akhirnya saya dapatkan:
Dan berikut adalah beberapa tes NUnit terhadap kode itu (saya menggunakan Rhino Mocks untuk mengejek HttpRequestBase, yang merupakan panggilan M <HttpRequestBase> di bawah):
sumber
publicForwardingIps.First()
?Saya mengalami masalah dalam menggunakan di atas, dan saya membutuhkan alamat IP dari pengontrol. Saya menggunakan yang berikut ini pada akhirnya:
sumber
HttpContext.Request.UserHostAddress
Di kelas Anda mungkin menyebutnya seperti ini:
Saya menggunakan ini di aplikasi pisau cukur dengan hasil yang bagus.
sumber
Bagaimana saya menjelaskan situs saya berada di belakang ELS ( Amazon Load Loader Elastis):
sumber