为什么请求显示成功时IsSuccessStatusCode的值为false?

时间:2016-11-12 04:45:59

标签: c# asp.net wpf asp.net-web-api asp.net-web-api2

我有一个使用ASP.NET Web API 2作为中央服务器的WPF客户端。在Web API中,我有这个动作:

[HttpPost]
public IHttpActionResult Get()
{
    IEnumerable<Person> persons;
    try
    {
        persons = Db.People.ToList();
    }
    catch (Exception ex)
    {
        return new ExceptionResult(ex, this);
    }
    return Ok(persons);
}

当我逐步执行此方法时,它将退出return Ok(persons);,我正在关注的调试将返回到WPF客户端,其中响应为IsSuccessStatusCode == false,状态为&#34; 500内部服务器错误&#34;并且在回答中没有任何地方解释原因?

我用通用方法调用此操作:

People = await Rest.PostAsync<IEnumerable<Person>>("/api/Persons");
...
public async Task<TReturn> PostAsync<TReturn>(string resource)
{
    var exMsg = $"Post request failed to get resource: '{resource}' from '{Client.BaseAddress}'.";
    try
    {
        HttpResponseMessage response = await Client.PostAsync(resource, null);
        if (!response.IsSuccessStatusCode)
        {
            Logger.Error(exMsg);
            RaiseException(response, exMsg);
        }
        return JsonConvert.DeserializeObject<TReturn>(await response.Content.ReadAsStringAsync());
    }
    catch (Exception ex) when (ex.GetType() != typeof(RestClientException))
    {
        Logger.Error(ex, exMsg);
        throw;
    }
}

我不会使用丑陋的毯子response.EnsureSuccessStatusCode(),因为我一直认为这会导致回复中的信息丢失。

一小时前,这仍然有效,除DataGrid中的列外没有代码更改,也许某种程度上,我更改了数据库中的数据,但没有更改数据模型中的任何数据模型组件。解。只有数据值,然后确保操作方法中的ToList()会将任何数据格式化为木工。

我只能知道控制器和客户端之间发生了HTTP 500,并且我在问什么可能是错的,我该如何诊断呢?

2 个答案:

答案 0 :(得分:1)

结果愚蠢的RestSharp抱怨它无法实例化界面&#34;当我将返回值的type参数赋予foreach (YourCollectionType item in datagrid.Items) { var children = datagrid.ItemsSource.OfType<YourCollectionType>().Where(x => x.Item1 == item.Item1 && x.Item2 == item.Item2 && x.Item3 == item.Item3 && x.Item4 == item.Item4); item.Results = children.Count(); Trace.TraceInformation(item.Results.ToString()); } 时。将其更改为IEnumerable<T>并且有效。然后我放弃了无用的库,转而使用纯净干净的List<T>,它可以将其响应内容反序列化为&#34;接口类型&#34;。

答案 1 :(得分:0)

如果它正好运行到&#34;返回OK&#34;线,有#34;人&#34;填充,然后我希望问题在于序列化Person对象 它是否具有引用其他&#34; Person&#34;例如,可以创建无限循环的实体?

如果可以,我会创建另一个端点,我可以使用Get请求调用,并使用浏览器发出请求,以便我可以非常轻松地看到错误响应。