是否有办法强制Azure CDN文件作为浏览器附件下载?

时间:2016-03-01 09:45:24

标签: c# asp.net azure cdn azure-cdn

我们正在构建一个与DAM(数字资产管理)系统集成的ASP.NET Web应用程序。 DAM将文件存储在Azure blob存储中,并使用Azure CDN公开提供。

我们将从我们的网络应用程序下载这些文件(大多数是PDF)。当用户请求其中一个文件时,我们将提供一个自定义URL,该URL将在返回相关文件进行下载之前在服务器上运行一些代码(记录下载等)。

客户端要求始终将文件作为浏览器附件(即内容处置附件标题)返回。我很好奇我在这里有什么选择。

我的理想是抽象CDN URL并且我的自定义URL是文件的公共URL。这将允许我设置相关的响应标题等。但是,我认为这里唯一的解决方案是从CDN下载文件并将其缓存在我的Web服务器上,这将模糊CDN的目的。因此,一旦我完成了服务器处理,我必须将客户端重定向到CDN公共URL。但是有没有办法可以确保Azure使用正确的响应标头返回文件,以确保委派浏览器的默认下载行为?

*更新*

在看到这个问题的答案时,我意识到我可能会提出错误的问题。谢谢那些在这里回答的人。 Follow-up question is here

1 个答案:

答案 0 :(得分:3)

TL; DR

您需要在Blob存储上配置默认版本,以便它向未经过身份验证的客户端显示所需的标头。 this question中的问题具有使其有效的代码。

一旦设置完成,并且为匿名客户端工作,CDN将复制所有标头,它应该按预期工作。

设置ContentDisposition

存在功能,您可以在blob property上设置ContentDisposition但是,虽然这将在blob上设置属性,但它不会传递到标头。

我使用以下方法使用Powershell对此进行了测试(仅因为它比c#更快)

$context = New-AzureStorageContext -StorageAccountName $StorageAccountName -StorageAccountKey $StorageAccountKey 

$container = Get-AzureStorageContainer -Name $ContainerName -Context $context 

$blobref = ($script:container.CloudBlobContainer.GetBlobReferenceFromServer("images/pier.jpg"))
$blobref.Properties
$blobref.Properties.ContentDisposition = 'attachment; filename="fname.ext"'  
$blobref.SetProperties()  

$blobref = ($script:container.CloudBlobContainer.GetBlobReferenceFromServer("images/pier.jpg"))
$blobref.Properties

产生(其中包括)

  

ContentDisposition:附件;文件名=" fname.ext"

但是在查询标题时没有设置任何内容

([system.Net.HttpWebRequest]::Create($blobref.Uri.AbsoluteUri)).getresponse() 

(回答评论,这些是返回的标题 - 在试验时我也尝试过使用和不使用内容类型 - 因此它在这里是空白的)

IsMutuallyAuthenticated : False
Cookies                 : {}
Headers                 : {x-ms-request-id, x-ms-version, x-ms-lease-status, x-ms-blob-type...}
SupportsHeaders         : True
ContentLength           : 142224
ContentEncoding         : 
ContentType             : 
CharacterSet            : 
Server                  : Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
LastModified            : 01/03/2016 11:29:04
StatusCode              : OK
StatusDescription       : OK
ProtocolVersion         : 1.1
ResponseUri             : https://xxxx.blob.core.windows.net/cdn/images/pier.jpg
Method                  : GET
IsFromCache             : False

由于CDN只会复制HTTP标头本身的信息,因此这些数据不会进入CDN。

编辑(扩展评论后)!

由于自身最为人所知的原因,Powershell并没有发送x-ms版本,所以我回到了确实产生标题的telnet -

HEAD  /cdn/images/pier.jpg HTTP/1.1
HOST: xxxx.blob.core.windows.net
x-ms-version: 2015-04-05

HTTP/1.1 200 OK
Content-Length: 142224
Last-Modified: Tue, 01 Mar 2016 11:29:04 GMT
Accept-Ranges: bytes
ETag: "0x8D341C4B1C4F34F"
Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
x-ms-request-id: b4f41b01-0001-00d7-7cc9-7384c9000000
x-ms-version: 2015-04-05
x-ms-lease-status: unlocked
x-ms-lease-state: available
x-ms-blob-type: BlockBlob
Content-Disposition: attachment; filename="fname.ext"
Date: Tue, 01 Mar 2016 14:49:17 GMT