预先设计的PUT工作在邮差,但403禁止在c# HttpClient



我使用以下.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

相关内容

  • 没有找到相关文章

最新更新