【发布时间】:2014-02-14 20:16:14
【问题描述】:
我有一个使用 webapi 加载/保存数据的网络应用程序 过去一切正常/ 今天发现有更新到 ASP.NET MVC/webapi,我安装了更新 但在那之后,用 jquery 发布数据不再有效。 我没有对客户端代码或 webapi 控制器进行任何更改。
我的典型 POST 语句如下所示:
showProgress(true, self.PanelID(), 'Saving...')
j$.ajax({
type: "POST",
url: uri,
data: dataObj,
error: function (jqXHR, status, error) {
showProgress(false);
GLOBAL.setMessage(self, 'Error saving ' + opType + '<br>' + error, true);
},
success: function (data, status, jqXHR) {
showProgress(false);
if (status === 'success') {
GLOBAL.setMessage(self, opType + " saved ok");
//....
$.ajax 代码出现以下错误
“发生了错误。” 异常消息 “在调用 HttpRequest.Form、Files、InputStream 或 BinaryRead 后,不支持此方法或属性。” 异常类型 “系统.Web.HttpException” 堆栈跟踪 在 System.Web.HttpRequest.GetInputStream(布尔型 persistEntityBody,布尔型 disableMaxRequestLength) 在 System.Web.HttpRequestWrapper.GetBufferedInputStream() 在 System.Web.Http.WebHost.SeekableBufferedRequestStream..ctor(HttpRequestBase 请求) 在 System.Web.Http.WebHost.HttpControllerHandler.c__DisplayClass11.b__b() 在 System.Web.Http.WebHost.HttpControllerHandler.LazyStreamContent.get_StreamContent() 在 System.Web.Http.WebHost.HttpControllerHandler.LazyStreamContent.CreateContentReadStreamAsync() 在 System System.Net.Http.HttpContentExtensions.d__0`1.MoveNext() 处的 .Net.Http.HttpContent.ReadAsStreamAsync() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 System.Web.Http.ModelBinding.FormatterParameterBinding.d__0.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.GetResult() 在 System.Web.Http.Controllers.HttpActionBinding.d__0.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext() 的 System.Runtime.CompilerServices.TaskAwaiter.GetResult() --- 堆栈跟踪结束先前引发异常的位置 --- System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult( ) 在 System.Web.Http.Filters.AuthorizationFilterAttribute.d__2.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()"这些是我的解决方案中的 nuget 包
包 id="Microsoft.AspNet.Mvc" 版本="5.1.0" targetFramework="net45" 包 id="Microsoft.AspNet.Razor" 版本="3.1.0" targetFramework="net45" 包 id="Microsoft.AspNet.SignalR.Client" 版本="2.0.1" targetFramework="net45" 包 id="Microsoft.AspNet.Web.Optimization" 版本="1.1.2" targetFramework="net45" 包 id="Microsoft.AspNet.WebApi" 版本="5.1.0" targetFramework="net45" 包 id="Microsoft.AspNet.WebApi.Client" 版本="5.1.0" targetFramework="net45" 包 id="Microsoft.AspNet.WebApi.Core" 版本="5.1.0" targetFramework="net45" 包 id="Microsoft.AspNet.WebApi.HelpPage.VB" 版本="5.1.0" targetFramework="net45" 包 id="Microsoft.AspNet.WebApi.OData" 版本="5.1.0" targetFramework="net45" 包 id="Microsoft.AspNet.WebApi.WebHost" 版本="5.1.0" targetFramework="net45" 包 id="Microsoft.AspNet.WebPages" 版本="3.1.0" targetFramework="net45" 包 id="Microsoft.Bcl" 版本="1.1.6" targetFramework="net45" 包 id="Microsoft.Bcl.Build" 版本="1.0.13" targetFramework="net45" 包 id="Microsoft.Data.Edm" 版本="5.6.0" targetFramework="net45" 包 id="Microsoft.Data.OData" 版本="5.6.0" targetFramework="net45" 包 id="Microsoft.Net.Http" 版本="2.2.18" targetFramework="net45" 包 id="Microsoft.Web.Infrastructure" 版本="1.0.0.0" targetFramework="net45"有谁知道可能是什么问题?关于如何修复它的任何想法?
编辑
示例控制器代码:
公共类 ImportController 继承 ApiController 公共函数 SaveImportSession(sessid As string, entity As SIImportSessionDTO) As HttpResponseMessage 尝试 InspectionData.SaveImportSession(sessid,实体) 暗淡响应 = Request.CreateResponse(HttpStatusCode.Accepted) 返回响应 捕获前作为 HttpResponseException 扔 抓住前任作为例外 抛出新的 HttpResponseException(Request.CreateResponse(Of String)(HttpStatusCode.InternalServerError, ex.Message)) 结束尝试 结束功能我只使用基于属性的路由,这是我的 webapi 路由配置
公共共享子寄存器(ByVal config As HttpConfiguration) config.MapHttpAttributeRoutes() config.Routes.MapHttpRoute(_ 名称:=“DefaultApi”,_ routeTemplate:="api/{controller}/{id}", _ 默认值:= 新的 {.id = RouteParameter.Optional} _问题,我的服务器端代码甚至没有到达,管道上的其他东西抛出异常
谢谢
【问题讨论】:
-
你能展示一下服务器端代码的样子吗
-
这看起来像是我们之前遇到的一个错误...您能否给我们提供您看到此问题的确切重现步骤...您是否明确设置了任何 Web API 缓冲区策略?你也能记下导致这种情况的顺序吗...
-
继续我之前的评论...您的路线是否有任何路线限制...我问这个是因为这是导致此类问题的路径之一...
-
不,我没有明确设置 Web API 缓冲区策略(我不知道那是什么)
-
感谢您的更新...从错误看来,请求流正在被其他代码片段读取...您是否可以提供独立的重现,以便我们可以深入挖掘以了解根本原因..
标签: jquery asp.net asp.net-web-api http-post