asp.net-core - 启用二进制媒体类型会中断 AWS Lambda 中的选项 POST 调用 (CORS)
问题描述
AWS 新手..
我们有一个在无服务器 aws 实例上作为 lambda 函数运行的 .NET Core 微服务。
我们的控制器看起来像这样
[Route("api/[controller]")]
[ApiController]
public class SomeController : ControllerBase
{
[HttpGet()]
[Route("getsomedoc")]
public async Task<IActionResult> GetSomeDoc()
{
byte[] content;
//UI needs this to process the document
var contentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
contentDisposition.FileName = "File Name";
Response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString();
return File(content, "application/octet-stream");
}
[HttpPost()]
[Route("somepost")]
public async Task<IActionResult> SomePost()
{
return null;
}
}
网址
{{URL}}/getsomedoc
{{URL}}/somepost
我们在 AWS 包设置中启用了“二进制媒体类型”,以便getsomedoc 正常工作,否则它会返回字节数组而不是文件。
但是,当 UI 使用 Method: OPTIONS & Access-Control-Request-Method as POST 访问 API 时,这会破坏我们的“ somepost ”调用
当我们删除二进制媒体类型时,“ somepost ”开始工作。
寻找有关为什么会发生这种情况的建议?以及我们可以从网关添加/删除什么来解决这个问题。
解决方案
我在我的 API 中发现了同样的行为。在到处寻找帮助时,我发现了一些解决问题的方法:
基本上,这个错误报告说问题是在启用 CORS 的同时还使用了通用的 Binary Media Type "*/*"
。显然 OPTIONS 方法对此感到困惑。他们在使用无服务器方面讨论了这一点,但它应该适用于使用控制台或其他与 AWS 交互的方式。
它们链接到一个可能的解决方案:您可以修改 OPTIONS 方法的集成响应 - 将映射模板的 Content-Type 更改为实际的二进制媒体类型,例如image/jpeg
. 他们说这允许您将设置中的二进制媒体类型保留为"*/*"
. 这有点hacky,但至少它是一些东西。
在这个 GitHub 存储库的问题部分中也有这个替代建议,它不那么 hacky。您可以将 OPTIONS 集成请求的内容处理参数设置为“CONVERT_TO_TEXT”...但您只能通过 CloudFormation 或 CLI(不能通过控制台)执行此操作。这也是一些 AWS 技术人员推荐的解决方案。
推荐阅读
- amazon-web-services - AWS - SQS 并发
- angular - 如何延迟角度动作或如何触发重新加载列表上的动作
- sql - 更新 BigQuery 中的重复记录值
- ruby-on-rails - 将“中国大陆”映射到 Ruby 中 Chartkick 图表的“中国”
- elasticsearch - 如何在 elasticseacrh 中用户查询应该和 must_not
- python - 使用获取字符串值然后返回字符串 vlaue 的 python 库制作模型
- c# - c#: 4 种编写相同代码的方法。都是一样的性能吗?
- google-cloud-functions - 如何从自己的服务器调用经过身份验证的云功能
- numba - 包含自定义 numba 对象列表的 Numba 类
- javascript - React + Ionic 5:标签导航问题