ASP.NET MVC - HttpRequestWrapper.Url是null?

我的应用程序会发送一些电子邮件,电子邮件中引用的图像路径需要根据用户访问发送电子邮件的页面的方式而有所不同。我已经多次使用过代码的变体而没有任何问题,但这是我第一次尝试在MVC应用程序中执行此操作:
var relImagePath = controllerContext.HttpContext.Response.ApplyAppPathModifier("~/Emails/Images");
var absImagePath = new Uri(controllerContext.HttpContext.Request.Url, relImagePath).AbsoluteUri;
第二行是抛出NullReferenceException,因为HttpContext.Request.Url为null。怎么可能? 编辑:我应该注意,我在与处理请求的线程池线程分开的线程池线程中运行此代码。如果我将此代码移回执行控制器操作的线程,则url就在那里。现在,我已经在同一个线程上执行代码。     
已邀请:
可能并不总是可以在线程中访问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);
    
我认为RequestContext在你调用controllerContext.HttpContext时抓取当前的HttpContext(因为它询问了RequestContext的HttpContext),我想它可能只是问HttpContext.Current,这就是为什么得到null。 尝试在ASP.NET线程中获取controllerContext.HttpContext,保存并传递给您自己的线程,而不是稍后在错误时间请求HttpContext的控制器上下文。 这是我的猜测。 另外,http://csharpfeeds.com/post/5415/Dont_use_the_ThreadPool_in_ASP.NET.aspx     
这种覆盖似乎也有效:
protected new UrlHelper Url
        {
            get { return base.Url ?? (base.Url = new UrlHelper(ControllerContext.RequestContext)); }
            set { base.Url = value; }
        }
    

要回复问题请先登录注册