zoukankan      html  css  js  c++  java
  • Asp.Net Core 3.1 获取不到Post、Put请求的内容 System.NotSupportedException Specified method is not supported

    问题

    是这样的,我.net core 2.1的项目,读取、获取Post请求内容的一段代码,大概这样:

    [HttpPost]
    public async Task<IActionResult> Test([FromBody]string postStr)
    {
    
        using (var reader = new StreamReader(Request.Body, System.Text.Encoding.UTF8))
        {
            reader.BaseStream.Seek(0, SeekOrigin.Begin);  //大概是== Request.Body.Position = 0;的意思
            var readerStr = await reader.ReadToEndAsync();
            reader.BaseStream.Seek(0, SeekOrigin.Begin);  //读完后也复原
    
            return Ok(readerStr);
        }
    }
    

    但这段代码 在 .net core 3.1.0 和 .net core 3.1.2(没错特地升级过) 都读不到、获取不到Post的内容:

    curl --location --request POST 'http://localhost:5001/api/TestPostReader/test' 
    --header 'Content-Type: application/json' 
    --data-raw '{"name":"hei"}'
    

    报异常:

    System.NotSupportedException: Specified method is not supported.
       at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.Seek(Int64 offset, SeekOrigin origin)
       at Push.WebApi.Controllers.TestPostReaderController.Test() in D:工作39solution-pushPush.WebApiControllersTestPostReaderController.cs:line 21
       at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Logged|12_1(ControllerActionInvoker invoker)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
       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 exception was thrown ---
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
       at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
       at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
       at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
       at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
       at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
    

    解决

    StartUp Configure 这里改成这样:

    app.Use((context, next) =>
    {
        context.Request.EnableBuffering();
        return next();
    });
    //这个在后边
    app.UseRouting();
    

    搞定:

    1584806891769

    问题不大,不过不想让大家重复趟坑。

    参考自:

    https://github.com/dotnet/aspnetcore/issues/15009

  • 相关阅读:
    Servlet简介
    Tomcat服务器(一)
    Java对象的serialVersion序列化和反序列化
    MySQL中不允许使用列别名作为查询条件
    IF函数
    IFNULL函数
    用Java取指定时区的时间 北京时间,纽约时间,班加罗尔时间
    一个CSV文件解析类
    Java中取两位小数
    JS传中文到后台需要的处理
  • 原文地址:https://www.cnblogs.com/xiaxiaolu/p/12543571.html
Copyright © 2011-2022 走看看