我有一个使用webapi加载/保存数据的网络应用程序 所有以前都工作正常/ 今天我发现有一个更新到ASP.NET MVC / webapi,我安装了更新 但在那之后,使用jquery的POSTing数据不再有效。 我在客户端代码或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代码出现以下错误
"An error has occurred." ExceptionMessage "This method or property is not supported after HttpRequest.Form, Files, InputStream, or BinaryRead has been invoked." ExceptionType "System.Web.HttpException" StackTrace at System.Web.HttpRequest.GetInputStream(Boolean persistEntityBody, Boolean disableMaxRequestLength) at System.Web.HttpRequestWrapper.GetBufferedInputStream() at System.Web.Http.WebHost.SeekableBufferedRequestStream..ctor(HttpRequestBase request) at System.Web.Http.WebHost.HttpControllerHandler.c__DisplayClass11.b__b() at System.Web.Http.WebHost.HttpControllerHandler.LazyStreamContent.get_StreamContent() at System.Web.Http.WebHost.HttpControllerHandler.LazyStreamContent.CreateContentReadStreamAsync() at System.Net.Http.HttpContent.ReadAsStreamAsync() at System.Net.Http.HttpContentExtensions.d__0`1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.ModelBinding.FormatterParameterBinding.d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at System.Web.Http.Controllers.HttpActionBinding.d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.Filters.AuthorizationFilterAttribute.d__2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()"
这些是我的解决方案中的nuget包
package id="Microsoft.AspNet.Mvc" version="5.1.0" targetFramework="net45" package id="Microsoft.AspNet.Razor" version="3.1.0" targetFramework="net45" package id="Microsoft.AspNet.SignalR.Client" version="2.0.1" targetFramework="net45" package id="Microsoft.AspNet.Web.Optimization" version="1.1.2" targetFramework="net45" package id="Microsoft.AspNet.WebApi" version="5.1.0" targetFramework="net45" package id="Microsoft.AspNet.WebApi.Client" version="5.1.0" targetFramework="net45" package id="Microsoft.AspNet.WebApi.Core" version="5.1.0" targetFramework="net45" package id="Microsoft.AspNet.WebApi.HelpPage.VB" version="5.1.0" targetFramework="net45" package id="Microsoft.AspNet.WebApi.OData" version="5.1.0" targetFramework="net45" package id="Microsoft.AspNet.WebApi.WebHost" version="5.1.0" targetFramework="net45" package id="Microsoft.AspNet.WebPages" version="3.1.0" targetFramework="net45" package id="Microsoft.Bcl" version="1.1.6" targetFramework="net45" package id="Microsoft.Bcl.Build" version="1.0.13" targetFramework="net45" package id="Microsoft.Data.Edm" version="5.6.0" targetFramework="net45" package id="Microsoft.Data.OData" version="5.6.0" targetFramework="net45" package id="Microsoft.Net.Http" version="2.2.18" targetFramework="net45" package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45"
有谁知道可能是什么问题?有关如何修复的想法吗?
修改
示例控制器代码:
Public Class ImportController Inherits ApiController Public Function SaveImportSession(sessid As string, entity As SIImportSessionDTO) As HttpResponseMessage Try InspectionData.SaveImportSession(sessid, entity) Dim response = Request.CreateResponse(HttpStatusCode.Accepted) Return response Catch ex As HttpResponseException Throw Catch ex As Exception Throw New HttpResponseException(Request.CreateResponse(Of String)(HttpStatusCode.InternalServerError, ex.Message)) End Try End Function
我只使用基于属性的路线,这是我的webapi路线配置
Public Shared Sub Register(ByVal config As HttpConfiguration) config.MapHttpAttributeRoutes() config.Routes.MapHttpRoute( _ name:="DefaultApi", _ routeTemplate:="api/{controller}/{id}", _ defaults:=New With {.id = RouteParameter.Optional} _
问题是,我的服务器端代码甚至没有达到,管道上的其他东西抛出异常
由于
答案 0 :(得分:6)
我发现了问题。
我的帖子代码使用$ .ajax(...),如初始消息所示。
但是jquery的.ajax将数据发布为application / x-www-form-urlencoded。 这在以前版本的WebAPI中有效,但在最新的更新中,它似乎默认不接受application / x-www-form-urlencoded。
我将内容类型更改为application / json,我不得不将数据转换为json,这解决了问题。
所以,而不是
j$.ajax({
type: "POST",
url: uri,
data: dataObj,
success: function(...)
我不得不改为
j$.ajax({
type: "POST",
url: uri,
data: JSON.stringify(dataObj),
contentType: "application/json; charset=utf-8",
success: function(...)
答案 1 :(得分:2)
第一条线索:
从web.config的身份验证设置中删除enableCrossAppRedirects =“true”解决了我的问题。感谢@ kiran-challa
答案 2 :(得分:2)
好的,我找到了解决这个问题的方法,没有解决方法。
参考此主题: h t t p:/ / s s p n e t w t s t a c k。 c o d e p l e。 c o m / discussion / 524616
这是5.1中的一个错误 - 它在夜间构建中得到解决 请参阅:https://aspnetwebstack.codeplex.com/ 并特别签署了夜间版本:
“每晚构建可以与Visual Studio 2010 SP1或Visual Studio 2012一起使用。要使用每晚构建:
1.在您的软件包管理器设置中添加以下软件包源:....
2.添加或更新到最新版本的ASP.NET。每晚构建标记(每晚YYYY MMM DD)。 “
这解决了我的帖子问题(不再需要使用JSON.stringify),还修复了上传文件的模块的多部分发布。
希望这有助于其他人! 希望很快就会有适当的补丁。
答案 3 :(得分:2)
今天发布了针对此问题的修复程序。将您的软件包更新到最新版本(5.1.1),您应该很高兴。
答案 4 :(得分:0)
更新到5.1后我有完全相同的问题。
我能够通过进行类似的更改(或实际上通过指定contentType)来克服此错误,但是,现在控制器方法接收到一个空对象。
这影响了应用程序中的所有POSTS - 所有以前都在工作。