【发布时间】:2013-10-12 14:42:51
【问题描述】:
我一直致力于为我公司的网站构建 API。我的所有 GET 操作都可以正常工作并返回我想要的 JSON。
我在使用 POST 创建新记录时遇到了问题。我正在将 JSON 发送到我的控制器。如果我的控制器正在接受字符串或对象参数,这可以正常工作,但在需要模型时不起作用。
在我的 api 控制器中,我有这个方法:
[HttpPost]
public void POSTEstimate(Estimate estimate)
{
//never makes it to the first line when expecting a Model (Estimate)
}
从我一直在阅读的内容来看,Web API 应该能够反序列化自动发布的 JSON(并将其放入我的模型中),但我总是收到 500 内部服务器错误。当我告诉它接受字符串时,该方法工作正常。
这里有什么明显的我做错了吗?
编辑:这是我用来调用 API 方法的测试页面的堆栈跟踪:
[WebException: The remote server returned an error: (500) Internal Server Error.]
System.Net.HttpWebRequest.GetResponse() +6120419
PDR.Controllers.AdminController.test() in c:\PDR\PDR\PDR\Controllers\AdminController.cs:714
lambda_method(Closure , ControllerBase , Object[] ) +96
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +205
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +50
System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +58
System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +237
System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50
System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24
System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +126
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +57
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +45
System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +25
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +61
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +25
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +49
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +28
System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +25
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +49
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9042109
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
【问题讨论】:
-
调试应用程序时会发生什么?调试会告诉你为什么会发生 500 Internal Server Error。
-
它在调试的任何地方都不会中断。它直接进入错误页面。
-
服务器可能会发回一些关于 500 的信息。这说明了什么?
-
那么错误一定是在模型绑定期间发生的......你确定你的模型类中没有任何错误吗(即带有一些可能抛出的代码或可能的属性的默认ctor扔等)?另外,我不确定您是否需要在 POST 上对 json 进行字符串化,您可以尝试将 $.ajax 调用的
data设置为“真实”json,即没有转义或引用,只是看看这是否有什么不同? -
不这么认为 - 你应该以
ModelState.IsValid==false而不是 Http 500 结束。我更倾向于认为默认模型绑定器正在受到来自尝试的异常的影响构建模型的实例,或绑定特定的属性值。如果您真的遇到困难,请尝试向您的 API (asp.net/web-api/overview/web-api-routing-and-actions/…) 添加自定义异常过滤器,这至少可以让您有机会看到“真正的”异常。
标签: c# asp.net-mvc asp.net-web-api