如何使用readasync将HTTP主体放入DOT Net Core 2.0中的字符串



我正在收到和http post请求,带有原始身体,我正在尝试将http身体流读为字符串。

我正在使用 dotnet Web 命令生成的基本Hello World Web项目。根据文档:

在.NET框架4和更早版本中,您必须使用方法 例如开始阅读和终止以实现异步I/O 操作。这些方法仍在.NET框架中可用 4.5支持遗产代码;但是,新的异步方法,例如readasync,writeasync,copytoasync和flushasync,可以帮助您实施 异步I/O操作更容易。

所以我尝试使用readasync方法以这样的方法:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // _controller = controller;
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.Run(async (context) =>
    {
        using (Stream Body = context.Request.Body) {
            byte[] result;
            result = new byte[context.Request.Body.Length];
            await context.Request.Body.ReadAsync(result, 0, (int)context.Request.Body.Length);
            String body = System.Text.Encoding.UTF8.GetString(result).TrimEnd('');
            _log.LogInformation($"Body: {body}");
        }
        await context.Response.WriteAsync("Hello World!");
    });
}

但是我会收到以下错误:

信息:microsoft.aspnetcore.hosting.internal.webhost1 请求开始http/1.1 post http://localhost:5000/json/testing?id = 2342& name = sas application/json 82失败:Microsoft.aspnetcore.server.kestrel [13] 连接ID" 0HL7ISBH941G6",请求ID" 0HL7ISBH941G6:00000001" 应用。system.notsupportedException:指定的方法不是 支持的。在 microsoft.aspnetcore.server.kestrel.core.internal.http.framerequeststream.get_length() 在mtss.ws.startup。 /home/inspiron/devel/apps/dotnet/mtss-ws/startup.cs:line 47

- 更新

我可以得到一些工作的工作,将缓冲区的大小设置为int16.maxvalue,但是这样我就无法阅读32k的尸体。

我发现了这个问题,因此可以帮助我找到以下解决方案:

app.Run(async (context) =>
{
    string body = new StreamReader(context.Request.Body).ReadToEnd();
    _log.LogInformation($"Body: {body}");
    _log.LogInformation($"Body.Length: {body.Length}");
    await context.Response.WriteAsync("Hello World!");
});

和异步版本几乎是相似的:

    string body = await new StreamReader(context.Request.Body).ReadToEndAsync();

不确定这是否是最佳方法...

i,也有读取的问题,停止了全部内容。我的解决方案类似于Opensas提供的解决方案,但是,我使用"使用"做了这件解决方案,因此StreamReader的Dispose方法将自动称为。我还将UTF8编码选项添加到StreamReader。

using StreamReader reader = new StreamReader (Request.Body, Encoding.UTF8);
string body = await reader.ReadToEndAsync ();

相关内容

  • 没有找到相关文章

最新更新