.NET Core部署staging读取Request.Form报Incorrect Content-Type错误
故障核心
读取HttpContext中的表单数据时报错Error attempting to read form data from HttpContext,属于典型的本地运行正常、部署后异常类问题。
问题场景
现有一个.NET Core Web项目,前端添加如下JavaScript代码绑定点击事件,发起POST请求提交resortId参数:
$trigger.on('click', function () { const $button = $(this); const resortId = $button.data('resortId'); $.post(url, { resortId: resortId }, function (response) { // 后续业务逻辑 }); });
经确认resortId参数可正常传递,对应后端控制器接口方法如下:
[HttpPost] [Route("wishlist/add")] public JsonResult Add() { var response= _repository.Add(Request, HttpContext.Session); return Json(response); }
该方法内部调用如下工具方法读取表单中的resortId参数:
private static int GetId(HttpRequest request) { var form = request.Form; int.TryParse(form["resortId"], out var resortId); return resortId; }
异常表现
代码在var form = request.Form;(Repository.cs第82行)处抛出异常,该代码逻辑本身无明显问题,整套代码在本地开发环境运行完全正常,部署到staging服务器后就会触发故障。
完整堆栈跟踪如下:
Message: "Incorrect Content-Type: " Inner Exception: "" StackTrace: " at Microsoft.AspNetCore.Http.Features.FormFeature.ReadForm() at Microsoft.AspNetCore.Http.DefaultHttpRequest.get_Form() at myproject.GetResortId(HttpRequest request) in Repository.cs:line 82 at Add(HttpRequest request, ISession session) in Repository.cs:line 31 at myproject.Controllers.Controller.Add() in Controller.cs:line 28 at lambda_method(Closure , Object , Object[] ) at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync() at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync() --- End of stack trace from previous location where the exception was thrown --- at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- End of stack trace from previous location where the exception was thrown --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() --- End of stack trace from previous location where the exception was thrown --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope) at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext) at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context) at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)"
排查过程
- 曾尝试改用jQuery ajax方法发起请求,显式指定Content-Type,但问题未解决。
- staging服务器目前未配置SSL证书,最初曾出现405响应,曾怀疑故障和证书缺失有关。
第一次更新
重构接口代码,新增强类型请求对象WishListAddRequest,将控制器方法修改为直接接收该参数:
[HttpPost] [Route("wishlist/add")] public JsonResult Add(WishListAddRequest request) { // 后续业务逻辑 }
新逻辑从Session中获取集合,用传入参数更新集合,该实现本地运行完全正常,但staging环境接口直接返回405状态码。
第二次更新
最终通过重构代码解决问题:移除JavaScript异步提交逻辑,改用原生HTML表单直接提交到对应控制器,不再依赖JS发起请求。曾尝试给staging站点配置SSL证书排除相关影响,但遇到网络问题未配置成功。推测故障原因是服务器配置了HTTP到HTTPS的重定向规则,但本身未部署SSL证书,导致AJAX请求触发CORS限制,该推测暂未验证。
内容的提问来源于stack exchange,提问作者Username_null
相关产品推荐
相关产品推荐

