ASP.NET MVC - HttpRequestWrapper.Url является нулевым? - PullRequest
2 голосов
/ 14 сентября 2010

Мое приложение отправляет некоторые электронные письма, и пути к изображениям, на которые есть ссылки в электронных письмах, должны различаться в зависимости от того, как пользователь получил доступ к странице, отправляющей электронную почту. Я много раз использовал варианты кода без проблем, но я впервые пытаюсь сделать это в приложении MVC:

var relImagePath = controllerContext.HttpContext.Response.ApplyAppPathModifier("~/Emails/Images");
var absImagePath = new Uri(controllerContext.HttpContext.Request.Url, relImagePath).AbsoluteUri;

Во второй строке выдается исключение NullReferenceException, поскольку HttpContext.Request.Url имеет значение null. Как это может быть?

Edit: я должен отметить, что я запускаю этот код в потоке пула потоков, отдельном от того, который обрабатывал запрос. Если я перенесу этот код обратно в поток, выполняющий действие контроллера, URL будет там. Сейчас я прибег к выполнению кода в том же потоке.

Ответы [ 3 ]

0 голосов
/ 15 сентября 2010

HttpContext не всегда может быть доступен в потоках. Вам нужно будет передать необходимую информацию в ветку:

var relImagePath = controllerContext.HttpContext.Response.ApplyAppPathModifier("~/Emails/Images");
var absImagePath = new Uri(controllerContext.HttpContext.Request.Url, relImagePath).AbsoluteUri;
new Thread(state => 
{  
    var imagePath = (string)state;
    // TODO ...
}).Start(absImagePath);

или если вы используете ThreadPool (только для краткосрочных задач):

ThreadPool.QueueUserWorkItem(state => 
{  
    var imagePath = (string)state;
    // TODO ...
}, absImagePath);
0 голосов
/ 30 июля 2013

Это переопределение также работает:

protected new UrlHelper Url
        {
            get { return base.Url ?? (base.Url = new UrlHelper(ControllerContext.RequestContext)); }
            set { base.Url = value; }
        }
0 голосов
/ 14 сентября 2010

Я хотел бы предположить, что RequestContext захватывает текущий HttpContext в то время, когда вы вызываете controllerContext.HttpContext (так как он запрашивает RequestContext для HttpContext), и я предполагаю, что он может просто запросить HttpContext.Current, и именно поэтому получить ноль.

Попробуйте захватить controllerContext.HttpContext в потоке ASP.NET, сохранить его и передать в свой собственный поток вместо контекста контроллера, который позже запрашивает HttpContext в неподходящее время.

Это мое предположение.

Также http://csharpfeeds.com/post/5415/Dont_use_the_ThreadPool_in_ASP.NET.aspx

...