Solusi ini juga mencakup API Web yang dihosting sendiri menggunakan Owin. Sebagian dari sini .
Anda dapat membuat metode privat dalam diri Anda ApiController
yang akan mengembalikan alamat IP jarak jauh tidak peduli bagaimana Anda menghosting API Web Anda:
private const string HttpContext = "MS_HttpContext";
private const string RemoteEndpointMessage =
"System.ServiceModel.Channels.RemoteEndpointMessageProperty";
private const string OwinContext = "MS_OwinContext";
private string GetClientIp(HttpRequestMessage request)
{
if (request.Properties.ContainsKey(HttpContext ))
{
HttpContextWrapper ctx =
(HttpContextWrapper)request.Properties[HttpContext];
if (ctx != null)
{
return ctx.Request.UserHostAddress;
}
}
if (request.Properties.ContainsKey(RemoteEndpointMessage))
{
RemoteEndpointMessageProperty remoteEndpoint =
(RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessage];
if (remoteEndpoint != null)
{
return remoteEndpoint.Address;
}
}
if (request.Properties.ContainsKey(OwinContext))
{
OwinContext owinContext = (OwinContext)request.Properties[OwinContext];
if (owinContext != null)
{
return owinContext.Request.RemoteIpAddress;
}
}
return null;
}
Referensi diperlukan:
HttpContextWrapper
- System.Web.dll
RemoteEndpointMessageProperty
- System.ServiceModel.dll
OwinContext
- Microsoft.Owin.dll (Anda akan memilikinya jika Anda menggunakan paket Owin)
Masalah kecil dengan solusi ini adalah Anda harus memuat pustaka untuk semua 3 kasus ketika Anda sebenarnya hanya akan menggunakan salah satu dari mereka selama runtime. Seperti yang disarankan di sini , ini dapat diatasi dengan menggunakan dynamic
variabel. Anda juga dapat menulis GetClientIpAddress
metode sebagai ekstensi HttpRequestMethod
.
using System.Net.Http;
public static class HttpRequestMessageExtensions
{
private const string HttpContext = "MS_HttpContext";
private const string RemoteEndpointMessage =
"System.ServiceModel.Channels.RemoteEndpointMessageProperty";
private const string OwinContext = "MS_OwinContext";
public static string GetClientIpAddress(this HttpRequestMessage request)
{
if (request.Properties.ContainsKey(HttpContext))
{
dynamic ctx = request.Properties[HttpContext];
if (ctx != null)
{
return ctx.Request.UserHostAddress;
}
}
if (request.Properties.ContainsKey(RemoteEndpointMessage))
{
dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
if (remoteEndpoint != null)
{
return remoteEndpoint.Address;
}
}
if (request.Properties.ContainsKey(OwinContext))
{
dynamic owinContext = request.Properties[OwinContext];
if (owinContext != null)
{
return owinContext.Request.RemoteIpAddress;
}
}
return null;
}
}
Sekarang Anda bisa menggunakannya seperti ini:
public class TestController : ApiController
{
[HttpPost]
[ActionName("TestRemoteIp")]
public string TestRemoteIp()
{
return Request.GetClientIpAddress();
}
}