C# 使用ModelState从WebAPI 2返回错误
我试图使用ModelState对象向客户端发送错误;我正在为该服务使用asp.net Web API 在Web服务方面,我正在这样做C# 使用ModelState从WebAPI 2返回错误,c#,rest,asp.net-web-api,.net-4.5,dotnet-httpclient,C#,Rest,Asp.net Web Api,.net 4.5,Dotnet Httpclient,我试图使用ModelState对象向客户端发送错误;我正在为该服务使用asp.net Web API 在Web服务方面,我正在这样做 public HttpResponseMessage VerifyData(Cobject data) { string[] errors; if (!VerifyAllRequiredData(data, out errors)) { foreach(string error
public HttpResponseMessage VerifyData(Cobject data)
{
string[] errors;
if (!VerifyAllRequiredData(data, out errors))
{
foreach(string error in errors)
ModelState.AddModelError("", error);
return Request.CreateErrorResponse(HttpStatusCode.ExpectationFailed, ModelState);
}
return Request.CreateResponse(HttpStatusCode.OK, data);
}
我正在为该服务创建一个.NET客户端库,以便我们可以将其用于现有的windows应用程序
在客户端:
public bool VerifyData(Cobject data)
{
try
{
HttpClient c = new HttpClient();
c.BaseAddress = BaseAddress;
c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(JsonHeader));
c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(HTMLHeader));
c.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(TextHeader));
var asyncResponse = this.PostAsJsonAsync(url, data);
asyncResponse.Wait();
asyncResponse.Result.EnsureSuccessStatusCode();
return true;
}
catch (HttpRequestException hre)
{
Console.WriteLine(hre.Message);
return false;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return false;
}
}
这里的问题是,我没有看到任何消息被添加到响应的ModelState中。我看到状态(ExpectionFailed),但没有消息。如何在客户端上检索这些消息?我使用“类似”的代码发布并访问我的web api。让我复制一些代码,以便您可以从ModelState获取信息
var responseTask = await client.SendAsync(request);
var result = responseTask.ContinueWith(async r =>
{
var response = r.Result;
var value = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
var obj = new { message = "", ModelState = new Dictionary<string,string[]>() };
var x = JsonConvert.DeserializeAnonymousType(value, obj);
throw new AggregateException(x.ModelState.Select(kvp => new Exception(string.Format("{0}: {1}", kvp.Key, string.Join(". ", kvp.Value)))));
}
}).Result;
[HttpGet]
public HttpResponseMessage Get([FromUri]InputFilterModel filter)
{
try
{
if (filter == null || ModelState.IsValid == false)
{
return (filter == null)? Request.CreateErrorResponse(HttpStatusCode.BadRequest,"Input parameter can not be null")
: Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
var responseTask=wait client.SendAsync(请求);
var result=responseTask.ContinueWith(异步r=>
{
var响应=r.结果;
var value=await response.Content.ReadAsStringAsync();
如果(!response.issucessStatusCode)
{
var obj=new{message=”“,ModelState=newdictionary()};
var x=JsonConvert.DeserializeAnonymousType(值,obj);
抛出新的AggregateException(x.ModelState.Select(kvp=>newException(string.Format(“{0}:{1}”),kvp.Key,string.Join(“.”,kvp.Value‘‘‘‘‘);
}
}).结果;
我希望这能为您带来好处:)我创建了一个强类型对象,使用方法如下:
public class BadRequestResponse
{
public string Message { get; set; }
public Dictionary<string, string[]> ModelState { get; set; }
}
实际上,您可以使用“CreateErrorResponse”解决该问题。此方法有一个重载,使您有机会发回ModelState
var responseTask = await client.SendAsync(request);
var result = responseTask.ContinueWith(async r =>
{
var response = r.Result;
var value = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
var obj = new { message = "", ModelState = new Dictionary<string,string[]>() };
var x = JsonConvert.DeserializeAnonymousType(value, obj);
throw new AggregateException(x.ModelState.Select(kvp => new Exception(string.Format("{0}: {1}", kvp.Key, string.Join(". ", kvp.Value)))));
}
}).Result;
[HttpGet]
public HttpResponseMessage Get([FromUri]InputFilterModel filter)
{
try
{
if (filter == null || ModelState.IsValid == false)
{
return (filter == null)? Request.CreateErrorResponse(HttpStatusCode.BadRequest,"Input parameter can not be null")
: Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
模型状态返回一个Json,模型中的每个字段都有验证问题。您可以看到它直接在浏览器中或使用fiddler执行查询。模型状态在HTTP内容中返回。您可以使用Fiddler查看它的外观。不幸的是,据我所知,没有Web API客户端支持对ModelState进行反序列化,但是自己定义一个兼容的模型非常容易。谢谢。BadRequestResponse定义帮助了我