Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.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
Angular httpclient拦截器:Angular隐藏的后端错误_Angular - Fatal编程技术网

Angular httpclient拦截器:Angular隐藏的后端错误

Angular httpclient拦截器:Angular隐藏的后端错误,angular,Angular,我有一个Angular 8应用程序调用.Net Core 3后端API,使用: this.http.get('/users') 我故意不传递不记名代币。API需要一个授权承载头,当上面的调用没有提供它时,.Net会在日志中正确输出: httpget/users响应401。AuthenticationScheme:承载人未经过身份验证 但是,Angular debug console为此显示以下三个条目,其中两个是无关的或完全错误的: 1) 加载资源失败:服务器响应状态为401()[ 2) 加载资

我有一个Angular 8应用程序调用.Net Core 3后端API,使用:

this.http.get('/users')

我故意不传递不记名代币。API需要一个授权承载头,当上面的调用没有提供它时,.Net会在日志中正确输出:

httpget/users响应401。AuthenticationScheme:承载人未经过身份验证

但是,Angular debug console为此显示以下三个条目,其中两个是无关的或完全错误的:

1) 加载资源失败:服务器响应状态为401()[

2) 加载资源失败:服务器响应状态为401()[

3) CORS策略已阻止从源“”访问“”处的XMLHttpRequest:请求的资源上不存在“访问控制允许源”标头[

我的第一个问题是上面的第(2)项不应该存在,因为没有第二个http调用或返回错误

我的第二个问题是上面的第(3)项不应该存在,因为我已经有了CORS设置,但是不管怎样。如果返回401,Net不会返回“Access Control Allow Origin”标题。那么Angular为什么要寻找一个呢

我的第三个也是最重要的问题是,在我的httpinterceptor中,我发现了这个错误:

intercept(请求:HttpRequest,下一步:HttpHandler):可观察{
返回next.handle(request).pipe(catchError)(错误:HttpErrorResponse)=>{

捕获的错误对象是:

error.status=0
这应该是401,但它是0

error.message=“Unknown error”
这应该是“未经授权”或类似的

因此,在我看来,httpinterceptor实际上是从上面的列表中传递错误号(3),而不是应该传递的错误号(1)

以前有没有人见过这个问题,或者知道如何解决这个问题?

这是由于一个bug(或者.Net Core 3中的不一致性):

基本上,.Net核心API大部分时间都会返回CORS头,除非JWT承载中间件出于某种原因(过期、丢失等)拒绝承载令牌。在这种情况下,.Net不会返回CORS标头。错误在于,即使是401“过期令牌”错误,它也应始终返回CORS标头,以允许调用客户端正确处理响应


结果是Angular http拦截器没有收到来自API的401错误,因为Angular将其替换为CORS“缺少标头”错误。这使得以角度正确响应这些响应变得困难,甚至不可能,因为您根本无法检测原始的401状态。

所有跨域请求都有一个选项请求,然后是实际请求。在这种情况下,您没有在.NET中配置CORS,因此您将得到最终错误。以及根据您链接到的规范GET不包含预飞行。事实上,我可以在API服务器跟踪上看到没有收到预飞行(作为验证,如果我单独调用POST端点,那么我会看到预飞行)。我的.Net API中也已经有CORS设置,我通过正确传递JWT承载令牌来验证,一切正常。因此,这种奇怪的情况发生在我不包含承载令牌的情况下。老实说,我认为没有必要投否决票……请注意文档中的附加要求
GET
请求不需要飞行前请求的选项:
内容类型标题唯一允许的值是:application/x-www-form-urlencoded;multipart/form data;text/plain
。状态值0通常用于corissues。我同意,这是一个问得很好的问题。我没有投反对票