我正在创建一个MVC 3应用程序(尽管适用于其他技术,例如ASP.NET Forms),并且只是想知道从代码提供图像而不是使用直接虚拟路径是否可行(性能明智)(如通常)。
我的想法是改进提供文件的常用方法:
我知道怎么做,但我不知道我应该这样做。
希望这一切都有意义!
谢谢, 丹。
更新
好的 - 让我们具体:
使用此类方法使用内存流为MVC 3中的所有图像提供服务会对性能产生什么影响?注意:图片网址是GenericFetchImage / image1(为简单起见 - 我的所有图片都是jpegs)。
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,那么服务器是否会在交付图像时处理负担。
谢谢!
答案 0 :(得分:8)
之前曾问过一个类似的问题(Can an ASP.Net MVC controller return an Image?),似乎对于动作中的图像与直接提供图像的性能影响非常小。正如所接受的答案所指出的那样,差异似乎是毫秒级(在该测试案例中,约为13%)。您可以在本地重新运行测试,看看您的硬件有何不同。
你应该使用 if 问题的最佳答案是从answer到(另一个)类似的问题(强调我的):
请担心以下事项:您需要在服务器上重新实施缓存策略,因为IIS会管理直接请求的静态文件。您还需要确保使用响应中包含的正确标头管理客户端缓存。 最后,问问自己,重新发明一种从服务器提供静态文件的方法是否符合您的应用需求。
解决您提供问题的具体案例:
应用安全检查
您已经可以使用IIS 7 integrated pipeline执行此操作。文档中的相关内容:
允许本机模块和托管模块提供的服务应用于所有请求,而不管处理程序如何。例如,托管表单身份验证可用于所有内容,包括ASP页面,CGI和静态文件。
基于路线值提供文件的标准化方法
如果我正确阅读文档,您可以在管道中尽早插入模块以重新编写传入的URL以直接指向静态资源,并让IIS从那里处理请求。 (为了完整起见,还有关于将路线映射到法师的相关问题:How do I route images using ASP.Net MVC routing?)
使ASP.NET组件能够提供之前因其放置在服务器管道中而无法使用的功能。例如,提供请求重写功能的托管模块可以在任何服务器处理之前重写请求,包括身份验证。
还有一些非常强大的URL rewrite features,它们或多或少都带有开箱即用的IIS。
返回修改后的图像(如果请求),例如不同的维度(好的,这只会谨慎使用,所以不要将其与上述性能问题联系起来)。
看起来module that does this已经可用于IIS了。不确定是否会因为代码服务图片而无法使用,我想可能会这样。
在允许访问资源之前执行业务逻辑
如果您正在执行业务逻辑以生成所述资源(如chart)或者您提到的验证码图像那么是的,您基本上别无选择,只能这样做。
< / LI> 醇>