ImageProcessor / Windows Azure存储问题,返回403 Forbidden

时间:2016-10-05 15:28:27

标签: asp.net-mvc umbraco azure-storage imageprocessor

这些图像可以加载到本地ENV中,也可以加载到生产环境中。但是,没有任何理由,暂存环境无法加载这些。

<package id="ImageProcessor" version="2.2.0.0" targetFramework="net45" />
  <package id="ImageProcessor.Web" version="4.2.1.0" targetFramework="net45" />
  <package id="ImageProcessor.Web.Config" version="2.2.0.0" targetFramework="net45" />
  <package id="ImageProcessor.Web.Plugins.AzureBlobCache" version="1.0.0.0" targetFramework="net45" />
  <package id="ImageProcessor.Web.PostProcessor" version="1.0.2.0" targetFramework="net45" />
  <package id="UmbracoAzureBlobStorageProvider" version="1.0.10.5" targetFramework="net45" />
  <package id="WindowsAzure.Storage" version="4.3.0" targetFramework="net45" />

我正在使用ImageProcessor,并根据需要将域列入白名单:

<whitelist>
        <add url="http://conceptjp.blob.core.windows.net/"/>
        <add url="https://az739977.vo.msecnd.net/"/>
</whitelist>

https://staging.conceptjp.com/remote.axd?https://az739977.vo.msecnd.net/media/6883/logo-sparitual.png?quality=70(不行)

https://conceptjp.com/remote.axd?https://az739977.vo.msecnd.net/media/6883/logo-sparitual.png?quality=70(有效)

https://cjp.local/remote.axd?https://az739977.vo.msecnd.net/media/6883/logo-sparitual.png?quality=70(作品,当地环境)

2016-10-04 13:31:11.2393 Logging.TheLogger The remote server returned an error: (403) Forbidden. The remote server returned an error: (403) Forbidden.    at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndExecuteAsync[T](IAsyncResult result)
   at Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.<>c__DisplayClass1`1.<CreateCallback>b__0(IAsyncResult ar)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at ImageProcessor.Web.Plugins.AzureBlobCache.AzureBlobCache.<IsNewOrUpdatedAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at ImageProcessor.Web.HttpModules.ImageProcessingModule.<ProcessImageAsync>d__10.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.TaskAsyncHelper.EndTask(IAsyncResult ar)
   at System.Web.HttpApplication.AsyncEventExecutionStep.OnAsyncEventCompletion(IAsyncResult ar)

1 个答案:

答案 0 :(得分:11)

我不知道该在这说什么。几乎所有东西都以我不会期望或推荐的方式使用。

如果您在Azure上使用Umbraco,则应为您的媒体使用以下插件。

https://github.com/JimBobSquarePants/UmbracoFileSystemProviders.Azure

你使用的FileSystemProvider已经过时了大约一年半。它实际上建议在其主页上使用上面提到的插件。

  

新包装UmbracoFileSystemProviders.Azure在线!   见:https://our.umbraco.org/projects/collaboration/umbracofilesystemprovidersazure/

     

我推荐它而不是这个,特别是如果你在Umbraco 7.3或更高版本。它解决了你在后台办公室会遇到的很多问题。

https://our.umbraco.org/projects/backoffice-extensions/azure-blob-storage-provider

原因是原始提供商存在缺陷,如果没有完全重写就无法修复。

  1. 使用绝对网址将媒体存储在数据库中。这意味着不能在多个环境中使用相同的媒体。
  2. 下载并在后台显示未处理的媒体。这导致100%的MB数据被不必要地下载,从而破坏了大型站点的性能。
  3. 在开始使用数据库之前,您必须更换媒体引用,以从存储的URL中删除域。我个人建议从头开始重建您的媒体部分。

    GitHub页面上有全面的说明,但我会在下面列出它们。

    首先。卸载旧插件,将所有ImageProcessor库更新到最新版本并安装推荐的FileSystemProvider插件

    然后使用以下内容更新~/Config/FileSystemProviders.config替换默认提供程序:

    <?xml version="1.0"?>
    <FileSystemProviders>
      <Provider alias="media" type="Our.Umbraco.FileSystemProviders.Azure.AzureBlobFileSystem, Our.Umbraco.FileSystemProviders.Azure">
        <Parameters>
          <add key="containerName" value="media" />
          <add key="rootUrl" value="http://[myAccountName].blob.core.windows.net/" />
          <add key="connectionString" value="DefaultEndpointsProtocol=https;AccountName=[myAccountName];AccountKey=[myAccountKey]"/>
          <!--
            Optional configuration value determining the maximum number of days to cache items in the browser.
            Defaults to 365 days.
          -->
          <add key="maxDays" value="365" />
        </Parameters>
      </Provider>
    </FileSystemProviders>
    

    您现在需要配置CloudImageService以捕获以/ media /

    开头的所有请求
    <?xml version="1.0"?>
    <security>
      <services>
        <service name="LocalFileImageService" type="ImageProcessor.Web.Services.LocalFileImageService, ImageProcessor.Web"/>
        <service prefix="media/" name="CloudImageService" type="ImageProcessor.Web.Services.CloudImageService, ImageProcessor.Web">
          <settings>
            <setting key="Container" value="media"/>
            <setting key="MaxBytes" value="8194304"/>
            <setting key="Timeout" value="30000"/>
            <setting key="Host" value="http://[myAccountName].blob.core.windows.net/media"/>
          </settings>
        </service>
      </services>  
    

    确保您的缓存配置设置正确。

    <caching currentCache="AzureBlobCache">
      <caches>
        <!-- Disk cache configuration removed for brevity -->
        <cache name="AzureBlobCache" type="ImageProcessor.Web.Plugins.AzureBlobCache.AzureBlobCache, ImageProcessor.Web.Plugins.AzureBlobCache" maxDays="365">
          <settings>
            <!-- The Account, Container and CDN details -->
            <setting key="CachedStorageAccount" value="DefaultEndpointsProtocol=https;AccountName=[CacheAccountName];AccountKey=[CacheAccountKey]"/>
            <setting key="CachedBlobContainer" value="cache"/>
            <!-- Whether to add the container name to the CDN url. Newer Azure formats require false. -->
            <setting key="UseCachedContainerInUrl" value="true"/>
            <!-- Full CDN root url e.g http://123456.vo.msecnd.net/ -->
            <setting key="CachedCDNRoot" value="[CdnRootUrl]"/>
            <!-- Optional setting for a timeout limit in milliseconds when attempting to communicate with the CDN url. -->
            <setting key="CachedCDNTimeout" value="1000"/>
            <!-- 
                Optional settings for better identifcation of source images if stored in 
                Azure blob storage.
             -->
            <setting key="SourceStorageAccount" value=""/>
            <setting key="SourceBlobContainer" value=""/>
            <!-- 
                Optional settings facilitate streaming of the blob resource directly instead of a redirect. This is beneficial
                for CDN purposes but caution should be taken if not used with a CDN as it will add quite a bit of overhead 
                to the site. 
             -->
            <setting key="StreamCachedImage" value="false"/>
          </settings>
        </cache>
      </caches>
    </caching>
    

    现在应该只使用根相对/media/路径创建映像请求,内置的虚拟路径提供程序将拦截并相应地进行处理。

    例如/media/1046/car-small.jpg?width=500&height=500&mode=boxpad&bgcolor=hotpink