【问题标题】:MVC site return Image URLMVC 站点返回图像 URL
【发布时间】:2017-07-20 16:35:30
【问题描述】:

我有一个具有 ONION 架构的 MVC 站点。

我正在尝试显示一些图像,我当前的尝试是从API 调用返回图像的URL,然后使用此路径检索HTML 中的图像。

但是,我在确定图像的 URL 应该是什么时遇到了一些问题,这让我想知道是否可以这样做。

基本上,这将是 API 调用的 URL:

http://devServer/api/v1/relevant?Id=187582

这将返回一个具有图像URL的对象

然后,在我的 REST 文件夹中,我将创建一个名为 Images 的文件夹来保存所有图像,然后我希望它们可以被 URL 检索,如下所示:

http://devServer/Images/img.png

这可能吗?如果可以,我怎样才能找到网址?

尝试以下操作会返回一个URL 和一个querystring,这似乎不是将返回图像的 URL:

HttpContext.Current.Request.Url.AbsolutePath
HttpContext.Current.Request.Url
//etc...

【问题讨论】:

  • 为什么不能直接返回"/Images/img.png"?那么标签应该去到网站的根目录<img src="/Images/img.png" />
  • 虽然这可能有效,但就我目前的目的而言,我需要完整的 URL
  • 然后您应该为存储外部可访问 URL 的环境(例如 web.config 等)引入一个设置。虽然您可以检查当前请求的来源,但如果网站位于负载均衡器后面,则可能是 localhost

标签: c# asp.net-mvc image url


【解决方案1】:

也许你可以试试这个代码,如果它适合你的需要:

// Get request object
var request = HttpContext.Current.Request;
// Generate base application url
var appBaseUrl = string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, Url.Content("~"));

// Somehow get name of an image (from filesystem, db, etc.)
var imageFileName = "img.png";
// Generate full image url
var imageUrl = string.Format("{0}/Images/{1}", appBaseUrl, imageFileName);

然后将 imageurl 作为对象或字符串的属性或您的 API 结果返回。

编辑:

要加入我的解决方案和 zaitsman 的评论,您可以编写一些返回图像 url 的小帮手:

public string GetImageUrl(string baseUrlFromConfig, string imageFileName)
{
    // Get request object
    var request = HttpContext.Current.Request;
    // Generate base application url
    var appBaseUrl = !string.IsNullOrWhiteSpace(baseUrlFromConfig)
        ? baseUrlFromConfig
        : string.Format("{0}://{1}{2}", request.Url.Scheme, request.Url.Authority, Url.Content("~"));

    // Generate full image url
    var imageUrl = string.Format("{0}/Images/{1}", appBaseUrl, imageFileName);

    return imageUrl;
}

您将从配置中传递 baseUrl(如果存在于配置中)和 imageFileName 以附加到 URL。

【讨论】:

  • 巴阿德的想法。如果您的网站位于负载平衡之后,则 request.Url.Authority 将是 localhost。
  • 使用request.Url.Host + ":" + request.Url.Port会更好吗?
  • 没有。 request.Url 将是new Uri("http://localhost/action/route");。如果您在反向代理后面运行,并且根据设置,可能无法获取请求者的原始 URL。在这种情况下,您需要将公共 URL 存储在某处(例如,这就是您需要在 Exchange/Sharepoint 等中执行此操作的原因)。
【解决方案2】:

这是我应该使用的:

HttpContext.Current.Request.Url.Authority

【讨论】:

  • 如果您的应用在反向代理之后运行,无论用户浏览器中的 URL 是什么,这都可能返回 localhost
  • @zaitsman +1 表示彻底,但在这种情况下不会
  • @zaitsman 给出了您的 cmets,并且上面的答案没有返回协议这一事实,我确实将 URL 存储为全局设置 - 不理想,因为它有其自身的缺点,但它会暂时解决我的问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2015-07-20
相关资源
最近更新 更多