我正在收到和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 ();