Asp নেট ওয়েব API 2.1 ক্লায়েন্টের আইপি ঠিকানা পান address


112

হ্যালো আমি ক্লায়েন্ট IP যে ওয়েব এপিআই মধ্যে কিছু পদ্ধতি অনুরোধ পেতে প্রয়োজন, আমি থেকে এই কোড ব্যবহার করার চেষ্টা করে থাকেন এখানে কিন্তু এটা সর্বদা সার্ভার স্থানীয় আইপি ফেরৎ, কিভাবে সঠিক ভাবে পেতে?

HttpContext.Current.Request.UserHostAddress;

অন্যান্য প্রশ্ন থেকে:

public static class HttpRequestMessageExtensions
    {
        private const string HttpContext = "MS_HttpContext";
        private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty";

        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;
                }
            }

            return null;
        }
    }

এই এক্সটেনশন পদ্ধতিটি আমার পক্ষে ভাল কাজ করে। (আমি OWIN বা অস্বাভাবিক কিছু ব্যবহার করছি না))
নেট বার্বেটিনি

উত্স স্বীকৃতি মহান। সম্পাদিত
স্টেফানো এমটাঙ্গু

উত্তর:


124

নিম্নলিখিত লিঙ্কটি আপনাকে সাহায্য করতে পারে। নিম্নলিখিত লিঙ্ক থেকে এখানে কোড।

রেফারেন্স: পাওয়ার-ক্লায়েন্ট-আইপি-মাধ্যমে-এসপ-নেট-ওয়েব-এপিআই

using System.Net.Http;
using System.ServiceModel.Channels;
using System.Web;
using System.Web.Http;


namespace Trikks.Controllers.Api
{
    public class IpController : ApiController
    {
          public string GetIp()
          {
                return GetClientIp();
          }

          private string GetClientIp(HttpRequestMessage request = null)
          {
                request = request ?? Request;

                if (request.Properties.ContainsKey("MS_HttpContext"))
                {
                      return   ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
                }
                else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
                {
                     RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
                     return prop.Address;
                }
                else if (HttpContext.Current != null)
                {
                    return HttpContext.Current.Request.UserHostAddress;
                }
                else
                {
                      return null;
                }
           }
     }
}

এটি করার আরেকটি উপায় নীচে রয়েছে।

রেফারেন্স: ক্লায়েন্ট-এস-আইপি-ঠিকানাতে কীভাবে অ্যাক্সেস করা যায়

ওয়েব হোস্ট করা সংস্করণের জন্য

string clientAddress = HttpContext.Current.Request.UserHostAddress;

স্ব জন্য হোস্ট করা

object property;
        Request.Properties.TryGetValue(typeof(RemoteEndpointMessageProperty).FullName, out property);
        RemoteEndpointMessageProperty remoteProperty = property as RemoteEndpointMessageProperty;


16

ব্যবহার করে আইপি পাওয়ার চেষ্টা করুন

ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";

1
@ ডেনিসবাবারকিন আমার মনে হয় এটি হওয়া উচিত, .. এটি সার্ভার ভেরিয়েবলের আইপি ঠিকানাটি REMOTE_ADDR
ব্যবহারকারী 1587439

9

আপনি যদি ওপিন স্ব-হোস্ট নুগেট প্যাকেজটি ব্যবহার করে Asp.Net 2.1 এর সাথে স্ব-হোস্টিং করছেন তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

 private string getClientIp(HttpRequestMessage request = null)
    {
        if (request == null)
        {
            return null;
        }

        if (request.Properties.ContainsKey("MS_OwinContext"))
        {
            return ((OwinContext) request.Properties["MS_OwinContext"]).Request.RemoteIpAddress;
        }
        return null;
    }

7

এই 4 বছরের পুরানো পোস্টের জবাব, কারণ এটি আমার কাছে অতি জটিল বলে মনে হচ্ছে, কমপক্ষে আপনি যদি আইআইএস-এ হোস্ট করছেন এবং "ওয়েব এপিআই কন্ট্রোলার আইপি অ্যাড্রেস পান" এর জন্য ডাকডকগো (এবং সম্ভবত এনএসএগল) এই পোস্টটি খুব বেশি।

আমি কীভাবে এটি সমাধান করেছি তা এখানে:

using System;
using System.Net;
using System.Web;
using System.Web.Http;
...
[HttpPost]
[Route("ContactForm")]
public IHttpActionResult PostContactForm([FromBody] ContactForm contactForm)
    {
        var hostname = HttpContext.Current.Request.UserHostAddress;
        IPAddress ipAddress = IPAddress.Parse(hostname);
        IPHostEntry ipHostEntry = Dns.GetHostEntry(ipAddress);
        ...

ওপি থেকে ভিন্ন, এটি আমাকে ক্লায়েন্ট আইপি এবং ক্লায়েন্টের হোস্টনাম দেয়, সার্ভার নয়। সম্ভবত তারা তখন থেকেই বাগ ঠিক করে ফেলেছে?


ডটনেটকোর ওয়েব এপিআই ব্যবহার করার জন্য একটি উত্তর দেখতে পছন্দ করবে। আমি বিশ্বাস করতে পারি না এত কঠিন কিছু করা খুব কঠিন difficult
এমসি 9000

5

এটি এটিকে দেওয়া আরও ভাল HttpContextBase, আপনি আরও সহজে এটি উপহাস এবং পরীক্ষা করতে পারেন

public string GetUserIp(HttpRequestMessage request)
{
    if (request.Properties.ContainsKey("MS_HttpContext"))
    {
        var ctx = request.Properties["MS_HttpContext"] as HttpContextBase;
        if (ctx != null)
        {
            return ctx.Request.UserHostAddress;
        }
    }

    return null;
}

1
আমি কাছাকাছি googled এবং জন এই সঙ্গে একমত বলে মনে হচ্ছে (HttpContextWrapper কারণ HttpContextBase উপহাস করা সহজ পরিবর্তে HttpContextBase কাস্ট।)
ডেভ Clausen

4

আমি মনে করি একটি এক্সটেনশন পদ্ধতি ব্যবহার করে এটি সর্বাধিক সুস্পষ্ট সমাধান:

public static class HttpRequestMessageExtensions
{
    private const string HttpContext = "MS_HttpContext";
    private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty";

    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;
            }
        }

        return null;
    }
}

সুতরাং ঠিক এটি ব্যবহার করুন:

var ipAddress = request.GetClientIpAddress();

আমরা আমাদের প্রকল্পগুলিতে এটি ব্যবহার করি।

উত্স / রেফারেন্স: ASP.NET ওয়েব এপিআই এ ক্লায়েন্টের আইপি ঠিকানা পুনরুদ্ধার করা


2

আমার সমাধানটি ব্যবহারকারীর 1587439 এর উত্তরের মতো, তবে সরাসরি নিয়ামকের নজরে কাজ করে (পরিবর্তে HttpContext.C ਚਲতি অ্যাক্সেস না করে)।

'ওয়াচ' উইন্ডোতে, আমি দেখেছি যে এটি.রেকুয়েস্টকন্টেক্সট. ওয়েবেআরকুয়েস্টে 'ইউজারহোস্টএড্রেস' সম্পত্তি রয়েছে তবে যেহেতু এটি ওয়েবহোস্টহট্টপ্রেমিক্সটেক্সটেক্সট ধরণের উপর নির্ভর করে (যা 'সিস্টেম.ওয়েব.এইচটিপি' সমাবেশের অভ্যন্তরীণ) - আমি ছিলাম না এটি সরাসরি অ্যাক্সেস করতে সক্ষম, তাই আমি সরাসরি এটি অ্যাক্সেসের জন্য প্রতিবিম্বটি ব্যবহার করেছি:

string hostAddress = ((System.Web.HttpRequestWrapper)this.RequestContext.GetType().Assembly.GetType("System.Web.Http.WebHost.WebHostHttpRequestContext").GetProperty("WebRequest").GetMethod.Invoke(this.RequestContext, null)).UserHostAddress;

আমি বলছি না এটি সেরা সমাধান। প্রতিবিম্বটি ব্যবহার করা ভবিষ্যতে ফ্রেমওয়ার্ক আপগ্রেডের ক্ষেত্রে (নাম পরিবর্তনের কারণে) সমস্যার কারণ হতে পারে তবে আমার প্রয়োজনের জন্য এটি নিখুঁত


0
string userRequest = System.Web.HttpContext.Current.Request.UserHostAddress;

এটি আমার উপর কাজ করে।

System.Web.HttpContext.Current.Request.UserHostName;এই একজন আমাকে একই রকম প্রত্যাবর্তন করবে যা আমি পাই UserHostAddress

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.