【问题标题】:ASP.Net Core doesn't recognize Request.MapPath in Razor segmentASP.Net Core 无法识别 Razor 段中的 Request.MapPath
【发布时间】:2017-07-06 14:29:00
【问题描述】:

使用 ASP.Net Core 对我来说还是有点陌生​​。我正在尝试遵循关于 PluralSight 的教程,该教程详细说明了 .NET 中的图像合成是如何工作的。

也就是说,我试图从 ASP.Net MVC 转换为 ASP.Net Core 的代码在我的Index.cshtml 中的Request 上显示错误:

<img src="@Url.Action("ImageFromPath", new { path = Request.MapPath("~/img/1.jpg") })" />

错误很简单:

当前上下文中不存在名称“请求”。

我的HomeController.cs

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    public ActionResult ImageFromPath(string path)
    {
        var ms = new MemoryStream();
        using (Bitmap bitmap = new Bitmap(path))
        {
            bitmap.Save(ms, ImageFormat.Jpeg);
        }

        ms.Position = 0;
        return File(ms, "image/jpg");
    }
}

在 MVC 中,我可以查找 Request 的定义,该定义一直追溯到 WebPageRenderingBase [from metadata],但在 .NET Core 中不存在此定义,谁能提供一种使其工作的方法?

编辑 - 我稍后计划使用后端 ImageFromPath 方法从 API 调用返回图像,而不是文件系统。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-core request


    【解决方案1】:

    您可以直接从文件系统提供图像,除非我遗漏了什么。

    <img src="@Url.Content("~/img/1.jpg")" alt="Some Text" />
    

    更新

    我稍后计划使用后端 ImageFromPath 方法返回一个 来自 API 调用的图像,而不是文件系统。

    您只需传递图像文件名,并在服务器端解析完整路径。

    <img src="@Url.Action("ImageFromPath", new { filename = "1.jpg" })" />
    
    public class HomeController : Controller
    {
        private readonly IHostingEnvironment _hostingEnvironment;
    
        public HomeController(IHostingEnvironment hostingEnvironment)
        {
            _hostingEnvironment = hostingEnvironment;
        }
    
        public ActionResult ImageFromPath(string filename)
        {
            string path = _hostingEnvironment.WebRootPath + "/img/" + filename;
            ...
        }
    }
    

    【讨论】:

    • 尝试您的解决方案 - 我收到一个错误:A null reference or invalid value was found [GDI+ status: InvalidParameter] 知道为什么在调试/开发模式下会出现这种情况吗? (如果发布到应用服务可能会有所不同)
    • 你可以试试this吗?
    • 是在 ConfigureServices 函数中还是在实际的 StartUp 中?
    • 我从来没有 IHostingEnvironment null,所以我没有得到改变来测试它。您可以尝试两者,看看有什么效果。
    【解决方案2】:

    您可以在视图中注入 IHostingEnvironment 变量并使用 Host 变量重写如下代码:

     @using Microsoft.AspNetCore.Hosting
     @inject IHostingEnvironment Host;
    
     <img src="@Url.Action("ImageFromPath", new { path = Host.WebRootPath + "/img/1.jpg" })"
    

    更新:

    没有看到 Win 的更新消息,他的解决方案使用相同的方法,但在关注点分离方面比我的解决方案更清晰。

    【讨论】:

    • 请不要那样做。恶意用户可以轻松找出网络服务器的目录结构,从而导致安全漏洞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多