Cors ASP.NET Web API:处理不允许的源消息
我正在我的ASP.NET Web API项目中启用CORS,一切都按预期工作。但是,如果提供了无效的源代码,我希望覆盖默认错误消息。现在,我将返回一条默认错误消息: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
{“消息”:“来源”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()