【发布时间】:2019-06-27 01:39:37
【问题描述】:
我正在尝试向服务器发送POST 请求。该请求进入Middleware 的Invoke 方法。
但是Content 始终为空,无论对象的类型如何。
发件人
public async Task<string> RunTestAsync(string request)
{
try
{
var content = new StringContent(JsonConvert.SerializeObject(request),Encoding.UTF8,"application/json");
var response=await this.client.PostAsync("http://localhost:8500/mat",
content);
string str=await response.Content.ReadAsStringAsync();
stringdata = JsonConvert.DeserializeObject<string>(str);
return data;
}
catch (Exception ex)
{
Console.WriteLine("Threw in client" + ex.Message);
throw;
}
}
服务器
服务器没有定义service,只是一个普通的middleware,它响应route。 (请求进入Invoke 方法!)
启动
public class Startup
{
public void ConfigureServices(IServiceCollection services) {
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
app.UseDeveloperExceptionPage();
app.UseBlazor<Client.Startup>();
app.Map("/mid", a => {
a.UseMiddleware<Mware>();
});
});
}
}
中间件
public class Mware
{
public RequestDelegate next{get;set;}
public Mware(RequestDelegate del)
{
this.next=del;
}
public async Task Invoke(HttpContext context)
{
using (var sr = new StreamReader(context.Request.Body))
{
string content = await sr.ReadToEndAsync();//null ,tried other types too , still null ,and the ContentLength is null too
var request=JsonConvert.DeserializeObject<string>(content);
if (request == null)
{
return;
}
}
}
}
我已经检查了我的序列化,并且对象序列化很好。
尽管如此,我总是在另一边收到null。
附言
我也试过不使用middleware,只是一个普通的委托,如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
app.UseDeveloperExceptionPage();
app.UseBlazor<Client.Startup>();
app.Map("/mid",x=>{
x.Use(async(context,del)=>{
using (var sr = new StreamReader(context.Request.Body))
{
string content = await sr.ReadToEndAsync();//null ,tried other types too , still null ,and the ContentLength is null too
var request=JsonConvert.DeserializeObject<string>(content);
if (request == null)
{
return;
}
}
});
}
即使没有专门的middleware,问题仍然存在。
问题不在于middleware,它的请求在客户端被正确序列化,发送到服务器,不知何故它的body 显示为null。
如果它未能deserialize 对象,我会理解,但HttpContext.Request.Body 作为字符串被接收null 并且它的length 是null !!
【问题讨论】:
-
@BercoviciAdrian
string request在发帖前应该代表什么?控制器上的Invoke方法是什么?动作还是局部方法?您所问的内容有太多未知数。 -
@BercoviciAdrian 如果您想吸引注意力来解决这个问题,您真的需要将其更新为minimal reproducible example。您最初没有得到它,因为缺少关于如何设置和配置、正在使用的平台版本等的太多细节。
-
@BercoviciAdrian
RunTestAsync中的string request参数假设包含什么以及为什么要序列化字符串? -
为了帮助我们更好地理解问题,首先,当你调用
await this.client.PostAsync("http://localhost:8500/mat", content);时,那么是直接调用中间件的Invoke方法吗?您是否尝试过调试它以实际查看整个HttpContext对象以及它包含什么? -
@BercoviciAdrian 这是一个路由问题。您的中间件在管道中注册较晚,并且正文在到达您的中间件时已经被读取。检查指针在正文流中的位置。我敢肯定它会在最后。这就是为什么您尝试在阅读器中阅读它的原因,但您一无所获。将中间件移到
app.UseBlazor<Client.Startup>();之前
标签: c# asp.net-core serialization blazor httpcontent