Servicestack - 从验证插件启用CORS以获得错误响应?

时间:2017-03-27 18:12:23

标签: cors servicestack

我没有正确设置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;
      }
  });

我特别需要这个响应头,因为如果没有设置,某些浏览器会阻止响应主体。再次感谢任何反馈。

1 个答案:

答案 0 :(得分:1)

[EnableCors]是一个请求过滤器属性,它在全局过滤器之后执行,其中使用全局请求过滤器执行验证过滤器。要在验证过滤器之前执行[EnableCors],它需要优先级<0

您可以动态地使用以下内容:

typeof(MyService).AddAttributes(
    new EnableCorsAttribute(allowedMethods: "POST", 
        allowedHeaders: "Authorization,Content-Type") { 
            Priority = -1 
        }
);