如何验证使用S3Reader调用Imageresizer的amazon url?

时间:2013-02-06 02:30:59

标签: c# asp.net-mvc imageresizer

我正在使用带有ImageResizer的S3Reader插件来读取来自亚马逊的调整大小的图像。

我在生产环境中工作时遇到了麻烦,主要是因为我无法看到幕后发生的事情。

我添加了大量的日志记录,当我请求预期的图像时,我知道ImageMissing事件正在被触发。

如果我手动检查url那里的图像,那么我唯一能想到的是通过S3Reader插件处理ImageResizer的某个地方?

那么我怎样才能看到ImageResizer用来从亚马逊请求图片的网址是什么?

我怀疑因为我的水桶在AisaPac地区,所以它不知道使用了正确的网址?

有些事情需要注意,我只处理media子域上的图片并重新编写网址(这也会影响它?)

我的代码和配置如下:

  <resizer>
    <diskcache dir="~/app_data" autoClean="true" />
    <clientcache minutes="1440" />
    <plugins>
      <add name="MvcRoutingShim" />
      <add name="S3Reader" buckets="media.domain.com" useSubdomains="true" />
      <add name="DiskCache" />
    </plugins>
  </resizer>

private static void ImageResizer_ReWrite(IHttpModule sender, HttpContext context, IUrlEventArgs args)
{
    string subDomain = context.Request.Url.SubDomain();

    if (string.IsNullOrWhiteSpace(subDomain) || subDomain != AppSettings.MediaSubDomain)
        return;

    args.VirtualPath = string.Format("/s3/{0}", AppSettings.AmazonS3BucketName) + args.VirtualPath;
    Logger.Error("New VirtualPath: " + args.VirtualPath);
}

private static void ImageResizer_OnPostAuthorizeRequestStart(IHttpModule sender2, HttpContext context)
{
    var subDomain = context.Request.Url.SubDomain();

    if (string.IsNullOrWhiteSpace(subDomain) || subDomain != AppSettings.MediaSubDomain)
        return;

    Config.Current.Pipeline.SkipFileTypeCheck = true;
    Config.Current.Pipeline.ModifiedQueryString["cache"] = ServerCacheMode.Always.ToString();
    Logger.Error("ImageResizer Process: " + context.Request.RawUrl);
}

调试跟踪中没有警告或错误,我希望返回图像时收到404.

1 个答案:

答案 0 :(得分:2)

Amazon S3建议使用子域地址方法来确保非美国区域的最佳性能 - 这是S3Reader默认执行的操作(以及您已启用的)。

因此,您的存储桶名称不能包含句点或前导破折号(但您可以使用嵌入的破折号)。

假设AmazonS3BucketName的值为“media.domain.com”,这就是图像查找失败的原因。

请参阅S3Reader plugin documentation page底部的有关存储桶命名的说明