Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法强制Azure CDN文件作为浏览器附件下载?_C#_Asp.net_Azure_Cdn_Azure Cdn - Fatal编程技术网

C# 有没有办法强制Azure CDN文件作为浏览器附件下载?

C# 有没有办法强制Azure CDN文件作为浏览器附件下载?,c#,asp.net,azure,cdn,azure-cdn,C#,Asp.net,Azure,Cdn,Azure Cdn,我们正在构建一个与DAM(数字资产管理)系统集成的ASP.NET web应用程序。DAM将文件存储在Azure blob存储中,并使用Azure CDN公开这些文件 我们将使这些文件(大部分是PDF)可从我们的web应用程序下载。当用户请求其中一个文件时,我们将提供一个自定义URL,在返回相关文件供下载之前,该URL将在服务器上运行一些代码(记录下载等) 客户端要求文件始终作为浏览器附件(即内容处置附件标题)返回。我很好奇我在这里有什么选择 我的理想是CDN URL是抽象的,而我的自定义URL是

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

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

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

我的理想是CDN URL是抽象的,而我的自定义URL是文件的公共URL。这将允许我设置相关的响应头等。然而,我认为这里唯一的解决方案是从CDN下载文件并将其缓存在我的web服务器上,这将混淆CDN的用途。因此,在完成服务器处理后,我可能必须将客户端重定向到CDN公共URL。但是,我有没有办法确保Azure返回具有正确响应头的文件,以确保浏览器的默认下载行为得到授权

*更新*

看到这个问题的答案,我意识到我可能问错了问题。感谢在座的各位

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

一旦设置好了,并且为匿名客户机工作,CDN将复制所有的头文件,并且应该按照预期工作

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

我使用Powershell测试了以下内容(只是因为它比c#快)

生产(除其他产品外)

内容处置:依恋;filename=“fname.ext”

但是,在查询标题时未设置任何内容

([system.Net.HttpWebRequest]::Create($blobref.Uri.AbsoluteUri)).getresponse() 
(为了回答注释,。这些是返回的标题-在试验期间,我也尝试使用和不使用contenttype-因此此处为空)

而且,由于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

这些文件需要在CDN上吗?它们可以直接从blob存储中提供/下载吗?是的,它们是最终由全球web平台提供服务的静态资产。我认为Azure存储没有任何问题。我相信您测试此功能的方式是不正确的。我认为
HttpWebRequest
实际上不会启动文件下载。它只需将blob的内容作为字节流读取并呈现给客户机。设置内容处置标头时,由浏览器启动下载。在浏览器中键入blob URL时会发生什么情况(当然,blob需要公开可用)?它被下载了吗?@GauravMantri我已经在问题中添加了随
HttpWebRequest
返回的标题-我实际上也尝试了其他几种方法,没有显示简单的数据-显然我们不关心它是否在此时下载,只关心是否存在正确的标题。在这种情况下,当在浏览器中查看时,
ContentDisposition
标题未按预期(在中)显示,图像将按正常方式显示。代码在那里,如果您觉得我遗漏了什么,请随意修改。您没有看到此标题的原因是您没有在HTTP请求中指定存储服务版本。由于您尚未指定存储服务版本,存储服务将选择默认版本(2009-09-19或类似版本)。内容处置标头是在存储服务REST API的更高版本中添加的。尝试以下操作,您将看到返回的标题:$req=([system.Net.HttpWebRequest]::Create($blobref.Uri.AbsoluteUri))$req.Headers.Add('x-ms-version','2015-04-05')$response=$req.getresponse()@GauravMantri Chrome等人如何在请求中指定存储版本?他们不知道存储的内容或位置,只执行HTTP 1.1 get请求。-在Powershell cmdlet上运行调试请求显示
api version=2015-06-15
需要
2013-08-15
-从我看到的情况来看,
ContentDisposition
未反映在标头中。不管他们怎么称呼。您的代码也会导致报告相同的标题,但不会。From:
如果对Blob服务的请求未指定x-ms-version标头,并且未使用set-Blob服务属性设置该服务的默认版本,则使用Blob服务的最早版本来处理该请求。但是,如果使用版本2009-09-19或更高版本执行的Set-container ACL操作公开了容器,则使用版本2009-09-19处理请求。
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
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