我有一个MVC应用程序,它在POST和GET上调用WebAPI异步。在本地运行WebAPI和MVC应用程序时,WebAPI响应显示成功,但SendAsync请求返回500.此外,Fiddler不显示API调用。我怀疑它与如何处理异步请求有关,但我不确定我缺少什么。
MVC Controller调用API:
public Model UploadFile(Model formCollection)
{
var documentModel = formCollection.ToString();
var client = new HttpClient();
var uri = new Uri(BaseUri + "document/");
var content = new StringContent(documentModel);
var request = new HttpRequestMessage(HttpMethod.Post, uri) {Content = content};
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var response = client.SendAsync(request);
response.Wait();
try
{
var returned = response.Result;
if (returned.StatusCode != HttpStatusCode.OK)
{
throw new Exception(returned.RequestMessage.ToString());
}
var model = JsonConvert.DeserializeObject<Model> (returned.Content.ReadAsStringAsync().Result);
model.FileContents = "";
return model;
}
catch(Exception e)
{
var error = new Exception("Service failure - ", e);
throw error;
}
}
WebAPI帖子:
[HttpPost]
public async Task<HttpResponseMessage> Post([FromBody]Model model)
{
var response = await SubmitNew(model);
return Request.CreateResponse(response);
}
在Post中返回时设置断点显示有效响应,但在MVC控制器中的response.Result上显示500.我甚至尝试返回OK请求,无论响应如下:
return Request.CreateResponse(HttpStatusCode.OK, result);
关于客户为何显示500的任何想法?
答案 0 :(得分:1)
在Global.asax.cs
中public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
// Try adding the following lines:
var configuration = GlobalConfiguration.Configuration;
var formatters = configuration.Formatters;
formatters.Clear();
formatters.Add(new JsonMediaTypeFormatter());
}
// A good idea to have this:
protected void Application_Error()
{
Exception unhandledException = Server.GetLastError();
// Set a breakpoint here or do something to log the exception
}
添加到Application_Start
的代码将确保序列化仅适用于JSON。虽然它可能不是您在最终代码中所需的内容,但作为一种临时措施来隔离问题的原因可能会有所帮助。
添加Application_Error
应该有助于捕获WebAPI层中出现的问题,例如,当它序列化您从控制器方法返回的对象时。
我怀疑SubmitNew
正在返回一些无法序列化的东西,例如无限递归引用(例如:带有相互引用的父/子结构)。
答案 1 :(得分:1)
我发现了问题,在初始POST和GET调用结果之后,WebAPI的日志服务中发生了超时错误。问题已解决。
答案 2 :(得分:0)
我在“改进”的某些代码上也遇到了类似的问题-我看到HttpResponseMessage实现了IDisposable接口,因此决定包装Return Request.CreateResponse方法是using语句,导致500错误。
删除using语句为我解决了这个问题。