我没有正确设置CORS标头(缺少所有CORS标头),验证失败(400次返回)。我使用验证功能插件,但我没有使用CORS插件。相反,我在逐个服务的基础上使用EnableCors属性。
来自我的auth端点的401响应确实正确设置了标头 - 我认为我通过以下方式实现了这一点:
typeof(Authenticate).AddAttributes(
new RestrictAttribute(RequestAttributes.HttpPost | RequestAttributes.HttpOptions),
new EnableCorsAttribute(allowedMethods: "POST", allowedHeaders: "Authorization,Content-Type"));
在验证失败时,服务缺少CORS标头:
[EnableCors(allowedMethods:"POST", allowedHeaders: "Authorization,Content-Type")]
public sealed class MyService : Service
{
...
[Authenticate]
public CustomResponse Post(CustomRequest request)
{
//some logic
return result;
}
...
}
通过Dto上的属性注册路线:
[Route("/myroute","POST, OPTIONS")]
public class CustomRequest: IReturn<CustomResponse>
{
...
}
如果需要,我可以提供更多详细信息。我知道我可以添加一个自定义响应过滤器来“完成”#39;但我想知道是否有更好的解决方案,而且我的配置错误。
更新
简单的全局响应过滤器不起作用 - 相反 - 您似乎需要在插件的ErrorResponseFilter中添加响应过滤器......
this.Plugins.Add(new ValidationFeature()
{
ErrorResponseFilter = (validationRes, resp) =>
{
if (resp is HttpError)
{
var obj = resp as HttpError;
obj.Headers.Add("Access-Control-Allow-Origin", "*");
}
return resp;
}
});
我特别需要这个响应头,因为如果没有设置,某些浏览器会阻止响应主体。再次感谢任何反馈。
答案 0 :(得分:1)
[EnableCors]
是一个请求过滤器属性,它在全局过滤器之后执行,其中使用全局请求过滤器执行验证过滤器。要在验证过滤器之前执行[EnableCors]
,它需要优先级<0
。
您可以动态地使用以下内容:
typeof(MyService).AddAttributes(
new EnableCorsAttribute(allowedMethods: "POST",
allowedHeaders: "Authorization,Content-Type") {
Priority = -1
}
);