我使用以下.Net代码从S3生成了一个预签名的url(在一个具有适当的IAM角色/桶权限的服务中)
var key = GenerateKey(jobId, batchId);
var linkExpiresAt = _dateTimeService.Now().AddMinutes(_expiryTime);
var request = new GetPreSignedUrlRequest
{
BucketName = _bucketName,
Key = key,
Verb = HttpVerb.PUT,
ContentType = "application/json",
Expires = linkExpiresAt,
ServerSideEncryptionMethod = ServerSideEncryptionMethod.None
};
var url = _s3Client.GetPreSignedURL(request);
我可以在Postman中使用此url进行内容'JSON'的PUT,但是当我尝试从代码中使用它时,我得到403
var content = new StringContent(mooStr, Encoding.ASCII, "application/json");
var fileStreamResponse = await httpClient.PutAsync(
url,
content);
是否有什么突出的错误与。net尝试PUT到url?
如果有人遇到同样的问题,我找到了解决方案。
当我运行Fiddler时,我捕获了来自Postman的成功请求和来自。net代码的失败请求。我能发现的唯一区别是,成功的一个有这个标题(我在我的第一篇文章中已经改为文本/纯文本,但问题仍然存在):-
内容类型:文本/平原
和来自。net的失败版本有:-
内容类型:文本/平原;utf - 8字符集=
在StackOverflow周围搜索了一下,发现了这些帖子
如何从HttpClient.PostAsJsonAsync()生成的内容类型头中删除charset=utf8 ?
使用HttpClient时,我如何不排除Content-Type中的字符集?
我编辑了小提琴手捕获的请求,并删除了字符集,它工作了。将我的原始代码修改为以下工作(注意-在StringContent上设置text/plain不起作用):-
var content = new StringContent(mooStr);
content.Headers.ContentType = MediaTypeHeaderValue.Parse("text/plain");
var fileStreamResponse = await httpClient.PutAsync(
Url,
content);
下面的代码为我工作(用于发布IFormFile类型的文件):
public async Task<bool> UploadObject(string preSignedUrl)
{
try
{
using (var client = new HttpClient())
{
StreamContent streamContent = new StreamContent(file.OpenReadStream());
var result = await client.PutAsync(preSignedUrl, streamContent);
if (result.StatusCode != HttpStatusCode.OK)
{
throw new Exception();
}
}
return true;
}
catch (Exception e)
{
....
}
return false;
}
使用IAmazonS3包创建preSignedUrl