Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.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
C# Json MVC:如何为失败的Json验证定制DTO错误消息_C#_Json_.net_Api_Json.net - Fatal编程技术网

C# Json MVC:如何为失败的Json验证定制DTO错误消息

C# Json MVC:如何为失败的Json验证定制DTO错误消息,c#,json,.net,api,json.net,C#,Json,.net,Api,Json.net,我在上配置了一个API项目以使用: Startup.cs public void配置服务(IServiceCollection服务) { // [...] services.AddControllers().AddNewtonsoftJson(); // [...] } Data.cs 使用系统; 使用System.Collections.Generic; 使用Newtonsoft.Json; 名称空间MyNS { [JsonObject] 公共类MyData { [JsonProperty(

我在上配置了一个API项目以使用:

Startup.cs

public void配置服务(IServiceCollection服务)
{
// [...]
services.AddControllers().AddNewtonsoftJson();
// [...]
}
Data.cs

使用系统;
使用System.Collections.Generic;
使用Newtonsoft.Json;
名称空间MyNS
{
[JsonObject]
公共类MyData
{
[JsonProperty(“查询”,Required=Required.Always)]
公共查询查询{get;set;}
[JsonProperty(“限额”)]
公共整数限制{get;set;}
}
公共类查询
{
[JsonProperty(“props”,Required=Required.Always)]
公共列表道具{get;set;}
}
公共类道具
{
//允许的值应仅为(“key1”和“key2”)。其他字符串或类型的验证应失败
[JsonProperty(“key”,Required=Required.Always)]
公共字符串密钥{get;set;}
[JsonProperty(“value”,Required=Required.Always)]
公共字符串值{get;set;}
}
}
MyController.cs

/[…]
[路线(“测试”)]
[HttpPost]
公共异步任务测试(MyData)
{
返回Json(数据);
}
// [...]
如果请求json正文未通过验证,则会向客户端返回一条状态为400的预配置错误消息:

请求

POST/test
{
“查询”:{
“道具”:[
{
“密钥”:“k1”,
“值”:“v1”
}
]
},
“限制”:“错误”
}
响应

{
“错误”:{
“限额”:[
无法将字符串转换为整数:错误。路径“限制”,第10行,位置18
]
},
“类型”:https://tools.ietf.org/html/rfc7231#section-6.5.1",
“标题”:“发生了一个或多个验证错误。”,
“状态”:400,
“traceId”:“2778ea7e-4DF69C960E985D5。”
}
我想使用我选择的DTO自定义错误响应,例如:
响应

“成功”:false,
“错误”:“第一个验证错误”

如何配置
Newtonsoft.Json
以使用自定义DTO处理验证错误?

找到了一个可能的解决方案:

Startup.cs

public void配置服务(IServiceCollection服务)
{
services.AddControllers()
.AddNewtonsoftJson(选项=>{})
.ConfigureApiBehaviorOptions(选项=>{
options.InvalidModelStateResponseFactory=上下文=>
{
string errorMessage=“验证错误”;
foreach(context.ModelState.Keys中的var键)
{
if(context.ModelState[key].Errors.Count>0)
{
errorMessage=string.Format(“Json属性“{0}”:{1}”,键,上下文。模型状态[key]。错误[0]。errorMessage);
打破
}
}
int statusCode=(int)HttpStatusCode.BadRequest;
var dto=新
{
成功=错误,
错误=错误消息
};
返回新的JsonResult(dto){StatusCode=StatusCode};
};
});
}