Cors ASP.NET Web API:处理不允许的源消息

Cors ASP.NET Web API:处理不允许的源消息,cors,asp.net-web-api2,Cors,Asp.net Web Api2,我正在我的ASP.NET Web API项目中启用CORS,一切都按预期工作。但是,如果提供了无效的源代码,我希望覆盖默认错误消息。现在,我将返回一条默认错误消息: {“消息”:“来源”http://xyz'是不允许的。“} 我想退回这样的东西: {“code”:1000,“Message”:“原点”http://xyz'是不允许的。“} 我通过自定义策略启用CORS: config.setCorspolicProviderFactory(新MyCorsPolicyProviderFacto

我正在我的ASP.NET Web API项目中启用CORS,一切都按预期工作。但是,如果提供了无效的源代码,我希望覆盖默认错误消息。现在,我将返回一条默认错误消息:

{“消息”:“来源”http://xyz'是不允许的。“}
我想退回这样的东西:

{“code”:1000,“Message”:“原点”http://xyz'是不允许的。“}
我通过自定义策略启用CORS:

config.setCorspolicProviderFactory(新MyCorsPolicyProviderFactory());
config.EnableCors();

在哪里定义错误消息?任何帮助都将不胜感激。谢谢。

我可以通过做类似于以下的事情来实现这一点:

  • 编写自定义
    CorsResult
    以存储错误代码
  • 公共类MyCorsResult:CorsResult{
    公共错误代码错误代码{get;set;}
    公共新bool有效{
    得到{
    return base.IsValid&&ErrorCode==默认值(int);
    }
    }
    }
    
  • 编写自定义
    CorsEngine
    并覆盖
    TryValidateOrigin
    以正确设置错误代码
  • 公共类mycorengine:CorsEngine{
    public bool TryValidateOrigin(CorsRequestContext requestContext、CorsPolicy策略、MyCorsResult){
    if(requestContext==null){
    抛出新ArgumentNullException(“requestContext”);
    }
    如果(策略==null){
    抛出新的异常(“策略”);
    }
    如果(结果==null){
    抛出新的ArgumentNullException(“结果”);
    }
    if(requestContext.Origin!=null){
    if(策略AllowAnyOrigin){
    if(策略支持需求){
    result.AllowedOrigin=requestContext.Origin;
    }
    否则{
    result.AllowedOrigin=CorsConstants.AnyOrigin;
    }
    }
    else if(policy.Origins.Contains(requestContext.Origin)){
    result.AllowedOrigin=requestContext.Origin;
    }
    否则{
    result.ErrorCode=1000;
    Add(string.Format(“不允许原点{0}”),requestContext.origin);
    }
    }
    否则{
    result.ErrorCode=1001;
    result.ErrorMessages.Add(“缺少原始标头”);
    }
    返回result.IsValid;
    }
    //由于我们现在使用的是'MyCorsResult'而不是'CorsResult',因此需要实现以下功能
    公共MyCorsResult评估策略(CorsRequestContext requestContext、CorsPolicy策略){
    if(requestContext==null){
    抛出新ArgumentNullException(“requestContext”);
    }
    如果(策略==null){
    抛出新的异常(“策略”);
    }
    MyCorsResult=新的MyCorsResult();
    if(this.TryValidateOrigin(请求上下文、策略、结果)){
    result.SupportsCredentials=policy.SupportsCredentials;
    if(requestContext.IsPreflight){
    if(此.TryValidateMethod(请求上下文、策略、结果)){
    if(!this.TryValidateHeaders(请求上下文、策略、结果)){
    返回结果;
    }
    result.PreflightMaxAge=policy.PreflightMaxAge;
    }
    返回结果;
    }
    AddHeaderValue(result.AllowedExposedHeaders、policy.ExposedHeaders);
    }
    返回结果;
    }
    私有静态void AddHeaderValues(IList目标,IEnumerable headerValues){
    foreach(headerValue中的字符串str){
    target.Add(str);
    }
    }
    }
    
  • 编写自定义
    CorsMessageHandler
    以将错误代码包含在错误响应中
  • 公共类MyCorsMessageHandler:CorsMessageHandler{
    专用HttpConfiguration\u HttpConfiguration;
    公共MyCorsMessageHandler(HttpConfiguration HttpConfiguration):基本(HttpConfiguration){
    _httpConfiguration=httpConfiguration;
    }
    公共异步重写任务HandleCorsPreflightRequestAsync(HttpRequestMessage请求、CorsRequestContext、CorsRequestContext、CancellationToken CancellationToken){
    httpresponsemessage2;
    if(请求==null)
    {
    抛出新的ArgumentNullException(“请求”);
    }
    if(corsRequestContext==null)
    {
    抛出新ArgumentNullException(“corsRequestContext”);
    }
    尝试
    {
    新的HttpMethod(corsRequestContext.AccessControlRequestMethod);
    }
    捕获(异常)
    {
    return request.CreateErrorResponse(HttpStatusCode.BadRequest,“访问控制请求方法不能为null或空”);
    }
    捕获(格式化异常)
    {
    return request.CreateErrorResponse(HttpStatusCode.BadRequest,string.Format(CultureInfo.CurrentCulture,“无效的访问控制请求方法:{0}”,新对象[]{corsRequestContext.AccessControlRequestMethod}));
    }
    CorsPolicy CorsPolicy=wait this.GetCorsPolicyAsync(请求,取消令牌);
    如果(公司策略!=null)
    {
    结果;
    HttpResponseMessage响应=null;
    if(此.tryEvaluationCorsPolicy(corsRequestContext、corsPolicy、out结果))
    {
    response=request.CreateResponse(HttpStatusCode.OK);
    response.WriteCorsHeaders(结果);
    }
    其他的
    {
    如果(结果!=null){
    如果(result.ErrorCode>0){
    var内容=新{
    代码=结果。错误代码,
    message=result.ErrorMessages.FirstOrDefault()