Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# API网关间歇返回;否';访问控制允许原点';标题已存在……”;当CORS选项请求成功完成时_C#_Cors_Aws Lambda_Aws Api Gateway_Kestrel Http Server - Fatal编程技术网

C# API网关间歇返回;否';访问控制允许原点';标题已存在……”;当CORS选项请求成功完成时

C# API网关间歇返回;否';访问控制允许原点';标题已存在……”;当CORS选项请求成功完成时,c#,cors,aws-lambda,aws-api-gateway,kestrel-http-server,C#,Cors,Aws Lambda,Aws Api Gateway,Kestrel Http Server,我完全不知道现在发生了什么。我已经阅读了几个小时关于API网关COR的帖子,它们都归结为相同的基本内容。您尚未在API上适当启用选项请求;在这一点上,我99%确信我做的是正确的 我正在使用由Amazon.Lambda.AspNetCoreServer库提供的Lambda托管Kestrel API,该库通过API网关映射。我目前将其托管在一个私有子网中,通过NAT网关提供internet访问,所有这些都通过在私有子网中启动的EC2实例进行了测试。我让API网关在API.example.com上工作

我完全不知道现在发生了什么。我已经阅读了几个小时关于API网关COR的帖子,它们都归结为相同的基本内容。您尚未在API上适当启用选项请求;在这一点上,我99%确信我做的是正确的

我正在使用由Amazon.Lambda.AspNetCoreServer库提供的Lambda托管Kestrel API,该库通过API网关映射。我目前将其托管在一个私有子网中,通过NAT网关提供internet访问,所有这些都通过在私有子网中启动的EC2实例进行了测试。我让API网关在API.example.com上工作,而实际的网站通过S3静态网站托管在example.com上

CORS在Startup类中的Kestrel Web API和API网关映射中都已启用,两者都允许所有路径。我一直在努力决定是否在API网关层启用CORS,因为我已经读到,通过API网关代理集成,您可以简单地将所有CORS验证卸载到Lambda层,这将有意义,而不是在两个单独的位置(API网关和Web API)复制CORS验证

从我的web客户端,我可以在大多数情况下对API发出请求而不会出现问题。看来,如果我给它足够的时间,后续的请求注定会失败。当用户登陆页面时,我向Lambda发出一个“激活”调用,以防止任何后续操作的加载时间过长。这应确保用户使用的是热lambda或冷冻lambda,而不是冷lambda。问题似乎在几分钟后出现,之前的lambda实例可能不再存在

如果我加载页面,lambda应该被激活。如果我给它一点时间,然后尝试提交联系信息,我通常会收到一个请求失败。开发人员控制台指出错误是由于“不存在“访问控制允许源”标题…”;但是,在某些特定的时间,我可以看到选项请求通过,但失败的响应不包含访问控制允许源标题


我完全不知所措,如果有人能帮助解释我所看到的不一致性,我将不胜感激。如果Lambda停止在我的C#应用程序中的CloudWatch中引发C语言错误,这将容易一百万倍。我对Lambda感到非常失望,并开始考虑使用其他托管方法

虽然我的回答相对较快,但这篇文章是经过几天研究后的最后努力。事实证明,这个问题与CORS并没有真正的关系,但它与Startup.cs类中异步上下文的使用有关

这个问题所涉及的失败具体发生在一个异步POST方法上。这个应用程序仍处于早期阶段,所以没有很多异步方法供我使用。我以为这是更高层次的失败;然而,这实际上是控制器级别异步上下文的失败

我曾尝试在Startup.cs类中使用异步方法来帮助初始化单例服务。此启动类中的Task.WaitAll用法破坏了整个应用程序的异步上下文。事实证明,我必须等待异步调用的任何尝试都会导致失败。最后,所有这些都源于在我的启动类中使用异步方法

一旦我删除了异步启动方法,我就能够毫无问题地使用我的API。CORS方法填充期间间歇性发生的故障是由于异步上下文失败造成的;然而,由于它是在请求选项方法时发生的,因此它将失败归因于CORS

今天的教训:如果您希望使用包Amazon.Lambda.AspNetCoreServer在Lambda微服务中实例化Kestrel API,最好不要在Startup.cs中使用ASYNC或TASK