C# Cloudfront已签名的URL不适用于使用.NET SDK的带空格的S3内容处置文件名

C# Cloudfront已签名的URL不适用于使用.NET SDK的带空格的S3内容处置文件名,c#,.net,amazon-web-services,amazon-s3,amazon-cloudfront,C#,.net,Amazon Web Services,Amazon S3,Amazon Cloudfront,我已经正确地设置了具有S3源的Cloudfront签名URL,并且正在使用响应内容配置查询字符串参数指定文件下载名称。当内容处置文件名不包含空格时,我使用.NET AWS SDKAmazonCloudFrontUrlSigner.GetCannedSignedURL方法生成的签名URL将正常工作。但是,如果文件名包含空格,则访问被拒绝。因此,下面的代码将生成一个URL,拒绝访问 var contentDisposition = HttpUtility.UrlEncode("attachment;

我已经正确地设置了具有S3源的Cloudfront签名URL,并且正在使用
响应内容配置
查询字符串参数指定文件下载名称。当内容处置文件名不包含空格时,我使用.NET AWS SDK
AmazonCloudFrontUrlSigner.GetCannedSignedURL
方法生成的签名URL将正常工作。但是,如果文件名包含空格,则访问被拒绝。因此,下面的代码将生成一个URL,拒绝访问

var contentDisposition = HttpUtility.UrlEncode("attachment;filename=My File.txt");
var key = "example.txt?response-content-disposition="+contentDisposition;
return AmazonCloudFrontUrlSigner.GetCannedSignedURL(
    AmazonCloudFrontUrlSigner.Protocol.https,
    "myBucket",
    cloudFrontPrivateKey,
    key, cloudFrontAccessKeyId, expirationDateTime);
显然,这似乎与URL编码有关


我已经通读了文件中关于的所有信息。我读了那本书。我还尝试了许多组合
UrlEncode
,比如不编码,只编码文件名部分,甚至不编码,但在生成签名URL后用编码版本替换。所有这些方法要么拒绝访问,要么出现签名与url不匹配的错误。

HttpUtility.UrlEncode方法将空格编码为
+
,根据标准,这是可以接受的。然而,由于某些原因,我不明白,这会导致签名URL和内容配置出现问题。另一种空间编码为
%20
,工作正常。因此,编码后,将
+
替换为
%20
。工作版本为:

var contentDisposition = HttpUtility.UrlEncode("attachment;filename=My File.txt");
contentDisposition = contentDisposition.Replace("+", "%20");
var key = "example.txt?response-content-disposition="+contentDisposition;
return AmazonCloudFrontUrlSigner.GetCannedSignedURL(
    AmazonCloudFrontUrlSigner.Protocol.https,
    "myBucket",
    cloudFrontPrivateKey,
    key, cloudFrontAccessKeyId, expirationDateTime);

HttpUtility.UrlEncode
方法将空格编码为
+
,根据标准,这是可以接受的。然而,由于某些原因,我不明白,这会导致签名URL和内容配置出现问题。另一种空间编码为
%20
,工作正常。因此,编码后,将
+
替换为
%20
。工作版本为:

var contentDisposition = HttpUtility.UrlEncode("attachment;filename=My File.txt");
contentDisposition = contentDisposition.Replace("+", "%20");
var key = "example.txt?response-content-disposition="+contentDisposition;
return AmazonCloudFrontUrlSigner.GetCannedSignedURL(
    AmazonCloudFrontUrlSigner.Protocol.https,
    "myBucket",
    cloudFrontPrivateKey,
    key, cloudFrontAccessKeyId, expirationDateTime);