এই সমাধানটি ওউইন ব্যবহার করে ওয়েব এপিআই-র স্ব-হোস্ট করাও কভার করে। আংশিকভাবে থেকে এখানে ।
আপনি নিজের মধ্যে এমন একটি ব্যক্তিগত পদ্ধতি তৈরি করতে পারেন ApiController
যা আপনি কীভাবে আপনার ওয়েব এপিআই হোস্ট করেন তা দূরবর্তী আইপি ঠিকানাটি ফিরিয়ে দেবে:
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)
{
// Web-hosting
if (request.Properties.ContainsKey(HttpContext ))
{
HttpContextWrapper ctx =
(HttpContextWrapper)request.Properties[HttpContext];
if (ctx != null)
{
return ctx.Request.UserHostAddress;
}
}
// Self-hosting
if (request.Properties.ContainsKey(RemoteEndpointMessage))
{
RemoteEndpointMessageProperty remoteEndpoint =
(RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessage];
if (remoteEndpoint != null)
{
return remoteEndpoint.Address;
}
}
// Self-hosting using Owin
if (request.Properties.ContainsKey(OwinContext))
{
OwinContext owinContext = (OwinContext)request.Properties[OwinContext];
if (owinContext != null)
{
return owinContext.Request.RemoteIpAddress;
}
}
return null;
}
প্রয়োজনীয় তথ্যসূত্র:
HttpContextWrapper
- System.Web.dll
RemoteEndpointMessageProperty
- সিস্টেম.সেবারমোডেল.ডিএল
OwinContext
- মাইক্রোসফট.উইন.ডিল (আপনি ওউইন প্যাকেজটি ব্যবহার করেন তবে ইতিমধ্যে এটি আপনার কাছে থাকবে)
এই সমাধানটির সাথে একটি সামান্য সমস্যা হ'ল আপনি যখন 3 টি ক্ষেত্রে ক্ষেত্রে লাইব্রেরি লোড করতে হয় তখন আপনি রানটাইমের সময় তাদের মধ্যে কেবল একটি ব্যবহার করবেন। এখানে প্রস্তাবিত হিসাবে , dynamic
ভেরিয়েবল ব্যবহার করে এটি কাটিয়ে উঠতে পারে । আপনি এর GetClientIpAddress
এক্সটেনশন হিসাবে পদ্ধতিও লিখতে পারেন 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)
{
// Web-hosting. Needs reference to System.Web.dll
if (request.Properties.ContainsKey(HttpContext))
{
dynamic ctx = request.Properties[HttpContext];
if (ctx != null)
{
return ctx.Request.UserHostAddress;
}
}
// Self-hosting. Needs reference to System.ServiceModel.dll.
if (request.Properties.ContainsKey(RemoteEndpointMessage))
{
dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
if (remoteEndpoint != null)
{
return remoteEndpoint.Address;
}
}
// Self-hosting using Owin. Needs reference to Microsoft.Owin.dll.
if (request.Properties.ContainsKey(OwinContext))
{
dynamic owinContext = request.Properties[OwinContext];
if (owinContext != null)
{
return owinContext.Request.RemoteIpAddress;
}
}
return null;
}
}
এখন আপনি এটি এর মতো ব্যবহার করতে পারেন:
public class TestController : ApiController
{
[HttpPost]
[ActionName("TestRemoteIp")]
public string TestRemoteIp()
{
return Request.GetClientIpAddress();
}
}