2013-10-17 107 views
0

我需要在所有操作中使用服務器的IP。因爲我發現在控制器構造函數中獲取服務器IP

_runningServer = AppConstants.Common.ServerDetect[Request.ServerVariables["LOCAL_ADDR"].Substring(0, 4)]; 

,原因是HTTP上下文尚未創建:

當我嘗試把這個在控制器的構造函數,它拋出一個錯誤。

我試過使用System.Web.HttpContext.Current但它沒有辦法。

我在Intranet應用程序中使用服務器IP作爲應用程序以各種方式進行自我配置的自動方式。

UPDATE:

似乎覆蓋Intialize()是我的情況下更好的解決方案:

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 
    _runningServer =AppConstants.Common.ServerDetect[System.Web.HttpContext.Current.Request.ServerVariables["LOCAL_ADDR"].Substring(0, 4)]; 
} 
+0

如果你正在使用它來配置你的應用程序,你可能應該考慮在應用程序啓動一個nd不是每個請求。 – Tommy

+0

我在我的mvc應用程序中也使用了這個區域,我需要的這個初始化只是針對某些控制器的一些常見操作。所以我認爲它不是完整的應用程序需要。 – e4rthdog

回答

0

繼@Tommy領先優勢我已經MSDN文檔中發現Initialize()方法可能比OnActionExecuting()一個更好的解決方案:

MSDN LINK

Initializes data that might not be available when the constructor is called.

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 
    _runningServer =AppConstants.Common.ServerDetect[System.Web.HttpContext.Current.Request.ServerVariables["LOCAL_ADDR"].Substring(0, 4)]; 
} 
+0

真棒 - 很高興知道。此外,您可以將自己的答案標記爲已接受,以便關閉您的問題,並且在您的歷史記錄中沒有未回答的問題! – Tommy

2

你是正確的,的HttpContext不會在控制器被實例化時存在。我會考慮覆蓋基本控制器的方法並在那裏存儲您的信息。

public class MyBaseController : Controller 
{ 
    public string _runningServer; 

    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _runningServer = AppConstants.Common.ServerDetect[ 
     filterContext.HttpContext.Request.ServerVariables. 
     ServerVariables["LOCAL_ADDR"].Substring(0, 4)]; 
     base.OnActionExecuting(filterContext); 
    } 
} 

現在你已經設置了你的變量,並且httpContext在這個時候可用。 _runningServer變量應該可用於您的所有控制器操作。爲了在你的控制器中使用它,你只需要改變類聲明。

public class HomeController : MyBaseController 
+0

如果我重寫控制器的Initialize()方法,該怎麼辦?是在那裏初始化httpcontext? – e4rthdog

+0

http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.initialize(v=vs.108).aspx – e4rthdog

+0

也許,我沒有否定該方法,因爲大多數例子似乎指向重寫這一個。試試吧,讓我們知道它是怎麼回事! :) – Tommy

1

在替代ActionFilter你可以創建自己的值提供商,搜索在RequestHeaders的數據和模型結合過程中填充的IP地址。

檢查本作的價值提供者:IValueProvider

相關問題