2010-09-14 11 views
2

Mon application envoie des e-mails, et les chemins d'image référencés dans les e-mails doivent varier en fonction de la façon dont l'utilisateur a accédé à la page qui envoie l'e-mail. J'ai utilisé des variations du code avant plusieurs fois sans problème, mais c'est la première fois que je suis en train de le faire dans une application MVC:ASP.NET MVC - HttpRequestWrapper.Url est null?

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

La deuxième ligne est de lancer un NullReferenceException parce HttpContext. Request.Url est nul. Comment cela peut-il être?

Modifier: Je dois noter que je cours ce code dans un fil de discussion thread pool séparé de celui qui a traité la demande. Si je déplace ce code sur le thread exécutant l'action du contrôleur, l'URL est là. Pour l'instant, j'ai recouru à l'exécution du code sur le même thread.

Répondre

0

HttpContext peut pas toujours être accessible dans les discussions. Vous aurez besoin de transmettre les informations nécessaires pour le fil:

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

ou si vous utilisez le ThreadPool (uniquement pour les tâches courantes courtes):

ThreadPool.QueueUserWorkItem(state => 
{ 
    var imagePath = (string)state; 
    // TODO ... 
}, absImagePath); 
0

Je suppose que RequestContext récupère HttpContext actuel au moment où vous appelez controllerContext.HttpContext (puisqu'il demande RequestContext pour le HttpContext), et je suppose qu'il peut demander simplement HttpContext.Current, et c'est pourquoi obtenir null. Essayez de récupérer controllerContext.HttpContext dans le thread ASP.NET, enregistrez-le et passez-le à votre propre thread, au lieu du contexte du contrôleur qui demande HttpContext au mauvais moment plus tard.

C'est mon avis.

En outre, http://csharpfeeds.com/post/5415/Dont_use_the_ThreadPool_in_ASP.NET.aspx

+0

Je suppose que vous avez raison sur le moment où le HttpContext est obtenu. Je vais regarder dans ça. Cependant, je voulais aussi commenter l'article que vous avez lié pour dire que je suis fortement en désaccord avec son «sentiment général». L'utilisation du pool de threads pour des tâches longues peut être un moyen sûr de ralentir la file d'attente de travail ASP.NET, mais pour de nombreuses tâches de type "fire and forget" de courte durée, le pool de threads est l'outil parfait et crée un nombre illimité d'autres discussions n'est presque jamais une bonne idée. – Chris

0

Ce remplacement semble également fonctionner:

protected new UrlHelper Url 
     { 
      get { return base.Url ?? (base.Url = new UrlHelper(ControllerContext.RequestContext)); } 
      set { base.Url = value; } 
     }