HttpContext.Current在MVC 4项目中无法解析

42
我希望使用ImageResizer(来自ImageResizing dot net)进行编程。我通过NuGet安装了适用于MVC的ImageResizer。但是当我尝试使用以下示例代码时:
//Loop through each uploaded file
foreach (string fileKey in HttpContext.Current.Request.Files.Keys)
{
    HttpPostedFile file = HttpContext.Current.Request.Files[fileKey];
    if (file.ContentLength <= 0) continue; //Skip unused file controls.

    //The resizing settings can specify any of 30 commands.. See http://imageresizing.net for details.
    //Destination paths can have variables like <guid> and <ext>, or 
    //even a santizied version of the original filename, like <filename:A-Za-z0-9>
    ImageResizer.ImageJob i = new ImageResizer.ImageJob(file, "~/uploads/<guid>.<ext>", new ImageResizer.ResizeSettings(
                            "width=2000;height=2000;format=jpg;mode=max"));
    i.CreateParentDirectory = true; //Auto-create the uploads directory.
    i.Build();
}

在foreach中,"HttpContext.Current.Request.Files.Keys"无法解析?我的using引用正确,Visual Studio没有提供"Resolve"选项。

HttpContext.Current是否被设置为任何值(是否“解析”),或者你只是看不到HttpContext.Current.Request.Files.Keys?这段代码来自你的控制器还是另一个类?如果这是从另一个类的方法中,那么请确保以某种方式将HttpContext.Current传递给它。要么作为调用方法的参数,要么在调用方法之前拥有一个可以接收此值的HttpContext类型公共成员。 - Floremin
HttpContext.Current不是全局的应用程序。它在处理请求的操作和视图中设置,但在请求周期外(例如模型、实用类等)它并不存在。如果您需要在那里使用它,必须从操作或视图中传递它,在那里它确实存在,正如@Floremin所说。 - Chris Pratt
好的 - 是的,这是在我的控制器中的一个操作。HttpContext可以解决,但Current不能。我发现HttpContext.Request.Files没有静态的Current,这似乎很好地工作。不确定为什么静态的Current不在那里,也许从控制器“上下文”无法访问?希望我没有错过任何东西而不使用静态的。谢谢! - Nick
示例代码适用于WebForms而非MVC,唯一的区别在于使用哪个引用。HttpContext.Request.Files 是正确的。 - Lilith River
3个回答

114

尝试在前面加上 System.Web.

如果我尝试使用 System.Web.HttpContext.Current,那么 'Current' 是存在的,但是如果我尝试使用 HttpContext.Current,则无法识别 'Current'。 我在 using 语句中有 System.Web,但似乎仍需要指定才能访问 'Current'。

@Chris 的答案 指出并解释了其中的原因。


4
即使你在using语句中包含了System.Web,为什么你仍然需要在HttpContext前加上System.Web呢?因为控制器已经有一个HttpContext属性,如果你不带上System.Web,它会引用它本地的属性,而这个属性没有当前的内容。 - Niraj

66

问题在于Controller类有一个名为HttpContext的公共属性(参见http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.httpcontext.aspx)。

这意味着当您在控制器中不加限定地尝试使用它时,它会解析为本地属性而不是System.Web.HttpContext。该属性的类型为HttpContextBase,它确实具有Request属性,可以实现您想要的功能(但请注意,它不是与System.Web.HttpContext获得的相同类)。


1
尽管这是一个(非常)旧的答案,我仍想补充一点,即您仍然可以通过执行“HttpContext.ApplicationInstance.Context”从HttpContextBase访问HttpContext。 - Frank Navarrete

4
非常简单的添加库
using System.Web;

替换

context.Response -> HttpContext.Current.Response

意味着

context -> HttpContext.Current

并且您的问题得到解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接