2

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

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

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

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

* 更新 *

在看到这个问题的答案时,我意识到我可能问错了问题。感谢那些在这里回答的人。后续问题在这里

4

1 回答 1

3

TL;博士

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

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

设置 ContentDisposition

该功能存在,您可以在blob 属性上设置 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-version,所以我退回到 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
于 2016-03-01T11:43:00.360 回答