Использование сервера в Mvc.Controller - PullRequest
3 голосов
/ 11 марта 2009

У меня есть свой собственный унаследованный App.Controller от Mvc.Controller, от которого наследуются все мои контроллеры. Я написал провайдера, использующего интерфейс, и реализовал его как MyService, а конструктор получает свойство Server, равное Mvc.Controller, которое имеет HttpServerUtilityBase.

Однако я создаю экземпляр MyService в конструкторе App.Controller. Проблема заключается в том, что свойство Server контроллера является null при построении MyService. Я использовал public Controller () : base() { }, чтобы получить базу для строительства. Однако Server остается null.

Я бы хотел избежать Web.HttpContext.Current.Server, если это возможно.

Есть ли у кого-нибудь решение этой проблемы?

Редактировать: Итак, я реализовал предложение tvanfosson, и когда мое приложение создает MyService в методе свойства get, Server по-прежнему равно нулю.

Редактировать 2: Не важно, я был дураком. У меня был другой Controller, использующий Server, и я этого не изменил. Дело закрыто.

Ответы [ 5 ]

8 голосов
/ 11 марта 2009

Используйте отложенную инициализацию для создания вашего сервиса.

private MyService service;
public MyService Service
{
    get
    {
         if (this.service == null)
         {
             this.service = new MyService(this.Server);
         }
         return this.service;
    }
}

Тогда ваш сервис фактически не создается, пока он не будет использован в действии контроллера, и к тому времени свойство Server будет установлено.

0 голосов
/ 21 ноября 2018

Согласно этому сайту , если у вас есть этот контроллер:

public class MyController : Controller
{
  private string folderPath;

  public MyController()
  {       
    // Throws an error because Server is null
    folderPath = Server.MapPath("~/uploads"); 

    // Throws an error because this.ControllerContext is null
    folderPath = this.ControllerContext.HttpContext.Server.MapPath("~/uploads"); 
  }
}

Затем вы хотите инициализировать его следующим образом:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
  base.Initialize(requestContext);

  // now Server has been initialized
  folderPath = Server.MapPath("~/uploads"); 
}
0 голосов
/ 24 апреля 2017

Это очень старый вопрос, но тема по-прежнему актуальна. Итак, один совет в 2017 году, который, возможно, был недоступен в 2009 году:

Это правда, что в конструкторе Controller Server имеет значение null. Но вы можете использовать событие OnActionExecuting:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{
    base.OnActionExecuting(filterContext);

    CurrentServer = Server; // CurrentServer is some instance variable I need later.
} 

Это прекрасно работает для меня.

0 голосов
/ 11 марта 2009

Зачем вам нужна ссылка на сервер? Вы делаете что-то вроде кодировки url / html? Если это так, вы можете использовать HttpUtility и полностью избавиться от ссылки на контекст.

0 голосов
/ 11 марта 2009

Я создаю экземпляр MyService в конструкторе App.Controller.

Вот твоя проблема. Вам нужно передать экземпляр MyService, который уже был встроен в ваш App.Controller конструктор. Взгляните на шаблоны Inversion of Control / Dependency Injection и посмотрите на некоторые библиотеки, которые упрощают эти шаблоны ( см. Этот список ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...