我正在创建一个 MVC 3 应用程序(尽管同样适用于其他技术,例如 ASP.NET Forms),并且只是想知道从代码提供图像而不是使用直接虚拟路径(像往常一样)是否可行(性能方面)。
我的想法是改进提供文件的通用方法:
- 应用安全检查
- 基于路由值的文件服务标准化方法
- 返回修改后的图像(如果需要),例如不同的维度(这个只会被谨慎使用,所以不要将其与上面的性能问题联系起来)。
- 在允许访问资源之前执行业务逻辑
我知道该怎么做,但我不知道是否应该这样做。
- 性能问题是什么(如果有)
- 是否发生了奇怪的事情,例如图像仅按顺序加载(也许这就是 HTML 目前的做法,我不确定 - 在这里暴露了我的无知)。
- 还有什么你能想到的。
希望这一切都有道理!
谢谢,
担。
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 管理直接请求的静态文件的缓存策略。您还需要确保使用响应中包含的正确标头来管理客户端缓存。最终,问问自己重新发明一种从服务器提供静态文件的方法是否可以满足您的应用程序的需求。
为了解决您随问题提供的具体案例:
-
应用安全检查
您已经可以使用IIS 7 集成管道 http://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis7-integrated-pipeline/。文档中的相关位:
允许本机和托管模块提供的服务应用于所有请求,无论处理程序如何。例如,托管表单身份验证可用于所有内容,包括 ASP 页面、CGI 和静态文件.
-
基于路由值的文件服务标准化方法
如果我正确阅读文档,您可以尽早在管道中插入一个模块,以重写传入的 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 或多或少是开箱即用的。
-
返回修改后的图像(如果需要),例如不同的维度(这个只会被谨慎使用,所以不要将其与上面的性能问题联系起来)。
它看起来像一个已可用于 IIS。不确定这是否属于通过代码提供图像的范围,我想可能会。
-
在允许访问资源之前执行业务逻辑
如果您正在执行业务逻辑来生成所述资源(例如chart http://www.codeproject.com/KB/aspnet/MvcChartControlFileResult.aspx)或者正如您提到的验证码图像那么是的,您基本上别无选择,只能这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)