ASP.NET (MVC) 提供图像

2024-04-20

我正在创建一个 MVC 3 应用程序(尽管同样适用于其他技术,例如 ASP.NET Forms),并且只是想知道从代码提供图像而不是使用直接虚拟路径(像往常一样)是否可行(性能方面)。

我的想法是改进提供文件的通用方法:

  1. 应用安全检查
  2. 基于路由值的文件服务标准化方法
  3. 返回修改后的图像(如果需要),例如不同的维度(这个只会被谨慎使用,所以不要将其与上面的性能问题联系起来)。
  4. 在允许访问资源之前执行业务逻辑

我知道该怎么做,但我不知道是否应该这样做。

  1. 性能问题是什么(如果有)
  2. 是否发生了奇怪的事情,例如图像仅按顺序加载(也许这就是 HTML 目前的做法,我不确定 - 在这里暴露了我的无知)。
  3. 还有什么你能想到的。

希望这一切都有道理!

谢谢, 担。

UPDATE

好的 - 让我们具体说一下:

使用这种类型的方法通过内存流为 MVC 3 中的所有图像提供服务会对性能产生什么影响?注意:图像 url 将是 GenericFetchImage/image1(为了简单起见 - 我的所有图像都是 jpeg)。

public FileStreamResult GenericFetchImage(string RouteValueRefToImage)
{
    // Create a new memory stream object
    MemoryStream ms = new MemoryStream();

    // Go get image from file location
    ms = GetImageAndPutIntoMemoryStream(RouteValueRefToImage);

    // return the output as a file
    return new FileStreamResult(ms, "image/jpeg");
 }

我知道此方法有效,因为我使用它根据验证码图像的会话值动态生成图像。它非常简洁 - 但我想使用这种方法进行所有图像检索。

我想我在上面的例子中想知道这是否可以这样做,或者是否需要更多的处理来执行,如果需要,需要多少处理?例如,如果访问者数量乘以 1000,那么服务器在传送图像时是否会承受处理负担。

THANKS!


之前也有人问过类似的问题(ASP.Net MVC 控制器可以返回图像吗? https://stackoverflow.com/questions/186062/can-an-asp-net-mvc-controller-return-an-image)并且看起来,通过动作与直接提供图像相比,性能影响非常小。正如已接受的答案所指出的,差异似乎约为毫秒(在该测试用例中,约为 13%)。您可以在本地重新运行测试,看看您的硬件有什么不同。

你的问题的最佳答案if你应该使用它是来自这个answer https://stackoverflow.com/questions/501893/mvc-rc-file-actionresult-performant/502176#502176到(另一个)类似的问题(强调我的):

请担心以下问题:您将需要在服务器上重新实现缓存策略,因为 IIS 管理直接请求的静态文件的缓存策略。您还需要确保使用响应中包含的正确标头来管理客户端缓存。最终,问问自己重新发明一种从服务器提供静态文件的方法是否可以满足您的应用程序的需求。

为了解决您随问题提供的具体案例:

  1. 应用安全检查

    您已经可以使用IIS 7 集成管道 http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis7-integrated-pipeline/。文档中的相关位:

    允许本机和托管模块提供的服务应用于所有请求,无论处理程序如何。例如,托管表单身份验证可用于所有内容,包括 ASP 页面、CGI 和静态文件.

  2. 基于路由值的文件服务标准化方法

    如果我正确阅读文档,您可以尽早在管道中插入一个模块,以重写传入的 URL 以直接指向静态资源,并让 IIS 处理来自那里的请求。(为了完整起见,还有一个关于将路线映射到法师的相关问题:如何使用 ASP.Net MVC 路由来路由图像? https://stackoverflow.com/questions/1146652/how-do-i-route-images-using-asp-net-mvc-routing)

    使 ASP.NET 组件能够提供以前由于放置在服务器管道中而无法使用的功能。例如,提供请求重写功能的托管模块可以在任何服务器处理之前重写请求,包括身份验证。

    还有一些相当强大的URL重写功能 http://www.iis.net/download/urlrewriteIIS 或多或少是开箱即用的。

  3. 返回修改后的图像(如果需要),例如不同的维度(这个只会被谨慎使用,所以不要将其与上面的性能问题联系起来)。

    它看起来像一个已可用于 IIS。不确定这是否属于通过代码提供图像的范围,我想可能会。

  4. 在允许访问资源之前执行业务逻辑

    如果您正在执行业务逻辑来生成所述资源(例如chart http://www.codeproject.com/KB/aspnet/MvcChartControlFileResult.aspx)或者正如您提到的验证码图像那么是的,您基本上别无选择,只能这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET (MVC) 提供图像 的相关文章

随机推荐

  • Win32 API C++ 菜单栏

    我正在尝试学习一些基本的 win32 api 我看到将项目添加到菜单栏教程中提到使用类似以下内容 hMenubar CreateMenu hMenu CreateMenu AppendMenuW hMenu MF STRING IDM FI
  • Vaadin 更改默认会话过期通知?

    瓦丁7 6 2 如何更改默认的会话过期通知 消息和通知类型 要更改会话过期消息 您需要创建自己的SystemMessagesProvider 您在其中定义它 例如 在 Servlet 部署中 您可以执行以下操作 WebServlet url
  • Hibernate 3.6:SQL 方言中的 registerFunction 不起作用

    我放弃并询问社区 在我的项目中 我使用 Hibernate 3 6 4 Final 和自定义 sql 方言 public class ServiceAppMySQL5InnoDBDialect extends MySQL5InnoDBDia
  • Bash 脚本使用 FreeTDS 建立连接、交互、不退出(只是挂起)

    我在脚本中使用 FreeTDS 将记录插入 MSSQL 数据库 这USEandINSERT命令有效 但是exit命令没有 它挂起 我尝试过重定向stdoutbutcat抱怨 我想我会用Expect http www nist gov mel
  • 未能向 master 发送加入请求

    我使用的是elasticsearch版本1 3 0 重启数据节点后 无法检测到主节点 我收到错误failed to send join request to master 在错误日志中 app101 dGRBqTFTQfae76IFCjsM
  • strtolower() 用于 unicode/多字节字符串

    我的页面中有一些非英语 外语文本 但是当我尝试将其变为小写时 它的字符会转换为包含问号的黑色菱形 a echo b strtolower a returns 我已在元标记中设置了字符集 但这并没有解决问题 我该怎么做才能将字符串转换为小写而
  • vim 中项目列表的智能硬包装

    我喜欢 vim 而且我真的很喜欢在写文字时将它们硬包装起来 Tim Pope 的 markdown 插件很棒 并且构建得当我尝试硬包装项目列表时它可以正确完成工作 好吧 这就是我所说的正确完成工作的意思 here I write a lon
  • iPhone 就像在 Silverlight ListBox 上滚动一样

    我需要一个具有类似 iPhone 功能的 Silverlight 列表框 也就是动画滚动 点击拖动滚动 在鼠标释放事件之后 滚动将根据拖动的 速度 继续进行一段时间 我搜索过 没有找到提供此功能的控件供应商 那么问题是我应该如何构建它 我需
  • 如何使用 rvest R 从谷歌新闻中获取头条新闻?

    我想使用 R 中的 rvest 从谷歌新闻中获取头条新闻 到目前为止我已经做到了这一点 library rvest url read html https www google com search hl en tbm nws authus
  • 根据其他字段 javax.validation 的条件进行选项的字段验证

    如果存在另一个字段 我需要执行字段验证 它可以是值之一 import javax validation class Person NotBlank private String name private Long groupId Valid
  • Windows 在 PATH 中搜索可执行文件的相对顺序是什么?

    如果我有a com a cmd a bat and a exe我的文件中的 PATH 如果我只调用该命令 Windows 会选择哪一个a 这是微软官方指定的吗 我只是想包裹我的gvim exe可执行文件 n 但是我的gvim bat似乎既不
  • Elasticsearch 过滤器/计算嵌套字段

    我有带有嵌套字段的文档 如下所示 results id 1234 name asdf id 5678 name jkl ip 1 2 3 4 嵌套字段的映射如下所示 results type nested properties id typ
  • PDO 最后插入 ID 总是正确的吗?

    我有以下代码 我想问的是这个 想象一下 当两个人同时加载页面时 是否存在其他人的查询在检索到最后一个 ID 之前插入 从而混淆 ID 的危险 不 这种情况是不可能的 方法 db gt lastInsertId 返回此数据库连接的最后插入的
  • 将一个 XML 包含在另一个 XML 中并使用 python 解析它

    我想将一个 XML 文件包含在另一个 XML 文件中并用 python 解析它 我正在尝试通过 Xinclude 来实现它 有一个 file1 xml 看起来像
  • 捕获 Exception 对象是否安全

    我使用依赖于异常的 Java 库 简化代码如下 try val eventTime eventTimeString as Date catch case e Exception gt logger error s Can t parse e
  • pandas,根据某些列值和 NAN 组合行

    所以我有一个 pandas 数据框 如下所示 id 1 id 2 value1 value2 1 2 100 NAN 1 2 NAN 101 10 20 200 NAN 10 20 NAN 202 10 2 345 345 我想要一个像这样
  • 比较 YUI 和 Ext JS [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何收到 SalesForce 中新潜在客户的通知? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望在 Salesforce 中创建新潜在客户时收到通知 Salesforce 中是否有类似 web
  • 自动将 Google 表格中单元格内容大写的脚本?

    我有一个电子表格 可以输入股票代码 我希望它们始终全部大写 无论它们如何输入 这似乎需要一些脚本 因为除非存在该列的第二个副本 否则无法使用函数来执行此操作 这是不可接受的 我有一个有效的解决方案 但有一个关键问题 代码如下 functio
  • ASP.NET (MVC) 提供图像

    我正在创建一个 MVC 3 应用程序 尽管同样适用于其他技术 例如 ASP NET Forms 并且只是想知道从代码提供图像而不是使用直接虚拟路径 像往常一样 是否可行 性能方面 我的想法是改进提供文件的通用方法 应用安全检查 基于路由值的