首页 > 解决方案 > 启用二进制媒体类型会中断 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 ”开始工作。

寻找有关为什么会发生这种情况的建议?以及我们可以从网关添加/删除什么来解决这个问题。

标签: asp.net-coreaws-lambdamicroservices

解决方案


我在我的 API 中发现了同样的行为。在到处寻找帮助时,我发现了一些解决问题的方法:

基本上,这个错误报告说问题是在启用 CORS 的同时还使用了通用的 Binary Media Type "*/*"。显然 OPTIONS 方法对此感到困惑。他们在使用无服务器方面讨论了这一点,但它应该适用于使用控制台或其他与 AWS 交互的方式。

它们链接到一个可能的解决方案:您可以修改 OPTIONS 方法的集成响应 - 将映射模板的 Content-Type 更改为实际的二进制媒体类型,例如image/jpeg. 他们说这允许您将设置中的二进制媒体类型保留为"*/*". 这有点hacky,但至少它是一些东西。

在这个 GitHub 存储库的问题部分中也有这个替代建议,它不那么 hacky。您可以将 OPTIONS 集成请求的内容处理参数设置为“CONVERT_TO_TEXT”...但您只能通过 CloudFormation 或 CLI(不能通过控制台)执行此操作。这也是一些 AWS 技术人员推荐的解决方案


推荐阅读