C# 使用ModelState从WebAPI 2返回错误

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

我试图使用ModelState对象向客户端发送错误;我正在为该服务使用asp.net Web API

在Web服务方面,我正在这样做

    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定义帮助了我