ASP.NET(MVC)服务图像

时间:2011-04-07 22:18:20

标签: asp.net asp.net-mvc image

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

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

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

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

      谢谢, 丹。

      更新

      好的 - 让我们具体:

      使用此类方法使用内存流为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,那么服务器是否会在交付图像时处理负担。

      谢谢!

1 个答案:

答案 0 :(得分:8)

之前曾问过一个类似的问题(Can an ASP.Net MVC controller return an Image?),似乎对于动作中的图像与直接提供图像的性能影响非常小。正如所接受的答案所指出的那样,差异似乎是毫秒级(在该测试案例中,约为13%)。您可以在本地重新运行测试,看看您的硬件有何不同。

你应该使用 if 问题的最佳答案是从answer到(另一个)类似的问题(强调我的):

  

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

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

  1.   

    应用安全检查

    您已经可以使用IIS 7 integrated pipeline执行此操作。文档中的相关内容:

      

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

  2.   

    基于路线值提供文件的标准化方法

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

      

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

    还有一些非常强大的URL rewrite features,它们或多或少都带有开箱即用的IIS。

  3.   

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

    看起来module that does this已经可用于IIS了。不确定是否会因为代码服务图片而无法使用,我想可能会这样。

  4.   

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

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

    < / LI>