【问题标题】:POSTing data to WebApi after update to 5.1.0 fails更新到 5.1.0 后将数据发布到 WebApi 失败
【发布时间】: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


【解决方案1】:

我发现了问题。

我的邮政编码使用 $.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(...)

【讨论】:

  • 我很高兴你能够解决这个问题......但这很奇怪......我仍然怀疑还有其他事情发生......webapi仍然接受formurlencoded帖子和你帖子中的异常只是似乎与此无关...有兴趣获得您之前所见内容的独立复制品,因为它可能是 webapi 方面的合法错误..
  • 您好,在安装 WebApi 2.1(版本号 5.1.0)之前,以 x-www-form-urlencoded 形式发送 POST 数据的代码运行良好。我只是传入了 JS 对象,让 jQuery 执行序列化。但在那次更新之后,代码停止工作。我提出了所有重要的 webapi 代码,我对管道上的其他任何东西都没有自定义过滤器。
  • 我在刚完成的一个新模块上遇到了这个问题,首先我认为我的代码有问题。幸运的是,我得到了测试一个我知道它可以工作的旧模块的灵感,它的行为完全相同,这让我发现新模块中没有我的特定代码,而是与我刚刚进行的 webapi 更新有关的东西跨度>
  • 我有兴趣进一步调查这个问题,如果你能给我一些关于检查什么的指导
  • 谢谢@bzamfir。根据我对这个问题的经验,其背后的原因可能是请求的流在被 Web API 再次读取之前被其他组件读取。我真的很想看看你的应用程序来解决这个问题。请通过 kiranchalla@hotmail.com 与我联系以进一步讨论此问题,如果可能的话,我想看看您的整个应用程序的代码。谢谢。
【解决方案2】:

第一条线索:

从 web.config 的身份验证设置中删除 enableCrossAppRedirects="true" 解决了我的问题。感谢@kiran-challa

【讨论】:

    【解决方案3】:

    对不起,我还不能发表评论,所以我必须添加一个答案。

    更新到 5.1 后我遇到了完全相同的问题。

    我能够通过进行类似的更改(或者实际上通过指定 contentType)来克服这个错误,但是,现在控制器方法接收到一个空对象。

    这影响了应用中的所有 POST - 所有之前都可以正常工作。

    【讨论】:

      【解决方案4】:

      好的,我找到了解决这个问题的方法。

      参考这个帖子: h t t p : // a s p n e t w e b s t a c k . c o d e p le x 。 c o m/discussions/524616

      这是 5.1 中的错误 - 它已在夜间构建中解决 见:https://aspnetwebstack.codeplex.com/ 特别是签名的夜间构建:

      “夜间构建可与 Visual Studio 2010 SP1 或 Visual Studio 2012 一起使用。要使用夜间构建: 1.在您的包管理器设置中添加以下包源: ....
      2.添加或更新到最新版本的 ASP.NET。每晚构建被标记(每晚 YYYY MMM DD)。 "

      这为我解决了发布问题(不再需要使用 JSON.stringify),还修复了上传文件的模块的多部分发布问题。

      希望这对其他人有帮助! 希望很快就会有适当的补丁。

      【讨论】:

      • Yip - 这个版本为我修复了它
      【解决方案5】:

      今天发布了针对此问题的修复程序。将您的软件包更新到最新版本 (5.1.1),您应该一切顺利。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-22
        • 1970-01-01
        • 2021-03-24
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        • 1970-01-01
        相关资源
        最近更新 更多