Как получить клиентский IP-адрес в статическом классе в asp.net mvc

Я хочу получить ip-адрес клиента в static class в asp.net mvc 3.

Но я не могу получить доступ к объекту запроса в статическом классе.

может ли кто-нибудь помочь, как получить ip-адрес без объекта запроса в статическом классе?

Ответ 1

Вы можете получить IP-адрес пользователя в статическом классе следующим образом:

        string ip = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
        if (string.IsNullOrEmpty(ip))
        {
            ip = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
        }
        return ip;

В этом методе лучше использовать этот Request.UserHostAddress(), поскольку иногда он будет захватывать только IP-адрес пользовательского прокси.

Ответ 2

вы можете передать HttpContext.Current по параметру контроллера в StaticClass, но это плохая практика.

Лучшая практика заключается в том, что конструктор Controller получает интерфейс класса реализации.

 private readonly IService _service;

        public HomeController(IService service)
        {
            _service = service;
        } 

и в классе обслуживания

 private readonly HttpContextBase _httpContext;
  public Service (HttpContextBase httpContext)
        {
            _httpContext= httpContext;
        } 

затем используйте IOC Containner (Ninject, AutoFac и т.д.) для зависимостей разрешения

пример в AutoFac (global.asax)

builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterModule(new AutofacWebTypesModule());
builder.RegisterType<Service>().As<IService>().InstancePerLifetimeScope();