我有一个使用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,并且我在问什么可能是错的,我该如何诊断呢?
答案 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请求调用,并使用浏览器发出请求,以便我可以非常轻松地看到错误响应。