首页 > 解决方案 > 无法从 POST 请求反序列化 HttpContent

问题描述

我正在尝试向服务器发送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在另一边得到一个。

PS

我也尝试过使用不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并且它lengthnull

标签: c#asp.net-coreserializationblazorhttpcontent

解决方案


在您的示例中,客户端代码调用路由“/mat”,但中间件配置在“/mid”。如果你正在运行的代码有同样的错误,中间件不会被命中,你总是会从客户端得到一个空响应,看起来就像中间件收到了一样null。确保您还使用了正确的端口号——我的 was :5000,但它可能会因运行时配置而异。

您是否使用调试器和断点进行测试?如果没有,我强烈建议尝试。我能够很快找到该错误,因为我在服务器端代码中设置了一个断点,并观察到它没有被命中。如果调试器不是一个选项,请考虑通过抛出异常(而不是简单地返回)来“大声失败”,以使您是否真正达到您认为您正在达到的条件更加明显。


推荐阅读