ASP.NET(MVC)服务图像

Dan*_*n B 8 asp.net asp.net-mvc image

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

我的想法是,我改进了提供文件的常用方法:

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

我知道怎么做,但我不知道我应该这样做.

  1. 有什么性能问题(如果有的话)
  2. 是否有奇怪的事情发生,例如图像只是按顺序加载(也许这就是HTML目前我不确定的方式 - 在这里暴露我的无知).
  3. 你能想到的任何其他东西.

希望这一切都有意义!

谢谢,丹.

UPDATE

好的 - 让我们具体:

使用这种类型的方法使用内存流为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");
 }
Run Code Online (Sandbox Code Playgroud)

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

我想我在上面的例子中想知道这是否可行,或者是否需要更多处理才能执行,如果是,那么多少?例如,如果访问者的数量乘以1000,那么服务器是否会在交付图像时处理负担.

谢谢!

R0M*_*RMY 8

之前曾问过一个类似的问题(ASP.Net MVC控制器可以返回一个图像吗?)而且看起来性能影响非常小,无法直接从动作中提供图像.正如所接受的答案所指出的那样,差异似乎是毫秒级(在该测试案例中,约为13%).您可以在本地重新运行测试,看看您的硬件有何不同.

最好的回答你的问题,如果你要使用它是从这个答案(别人)类似的问题(重点煤矿):

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

要解决您提供的具体问题:

  1. 应用安全检查

    您已经可以使用IIS 7集成管道执行此操作.文档中的相关位:

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

  2. 基于路由值提供文件的标准化方法

    如果我正确地阅读文档,您可以在管道中尽早插入模块以重新编写传入的URL以直接指向静态资源,并让IIS从那里处理请求. (为了完整起见,还有关于将路由映射到法师的相关问题:如何使用ASP.Net MVC路由路由图像?)

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

    还有一些非常强大的URL重写功能,它们或多或少都带有开箱即用的IIS.

  3. 返回修改后的图像(如果请求),例如不同的尺寸(确定这只会谨慎使用,所以不要将其与上面的性能问题联系起来).

    它看起来像一个模块,它已经可用于IIS.不确定是否会因代码服务图像而不是,我猜它可能.

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

    如果你正在执行业务逻辑来生成所述资源(如图表)或者你提到的验证码图像那么是的,你基本上别无选择,只能这样做.