无法从POST请求反序列化HttpContent

时间:2019-02-02 20:14:03

标签: c# asp.net-core serialization blazor httpcontent

我正在尝试向服务器发送POST请求。该请求进入Middleware的{​​{1}}方法中。

无论对象的类型如何,Invoke始终为null。

发件人

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; } } } } 在另一侧上。

PS

我已经使用类似下面没有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及其nulllength !! < / p>

3 个答案:

答案 0 :(得分:1)

在您的示例中,客户端代码将路由称为“ / mat”,但中间件配置为“ / mid”。如果您正在运行的代码具有相同的错误,则中间件将不会受到攻击,并且您始终会收到一个空响应,该响应从客户端看起来就像中间件收到了null。确保您也使用了正确的端口号-我的端口号是:5000,但是它可能会根据运行时配置而有所不同。

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

答案 1 :(得分:1)

不知道您的代码到底有什么问题,但这可以起作用:

public class Startup
{
  // This method gets called by the runtime. Use this method to add services to the container.
  // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
  public void ConfigureServices(IServiceCollection services)
  {
  }

  // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {
    if (env.IsDevelopment())
    {
      app.UseDeveloperExceptionPage();
    }

    app.Run(async (context) =>
    {
      var request = context.Request;
      var body = request.Body;

      request.EnableRewind();
      var buffer = new byte[Convert.ToInt32(request.ContentLength)];
      await request.Body.ReadAsync(buffer, 0, buffer.Length);
      var bodyAsText = Encoding.UTF8.GetString(buffer);
      request.Body = body;
      await context.Response.WriteAsync(bodyAsText);
    });
  }
}

在chrome开发工具中运行此代码

fetch('http://localhost:39538', {
  method: 'POST',
  body: JSON.stringify({
    title: 'foo',
    body: 'bar',
    userId: 1
  }),
  headers: {
    'Content-type': 'application/json; charset=UTF-8'
  }
})
.then(res => res.json())
.then(console.log)

在浏览器中产生以下内容:

  

{“ title”:“ foo”,“ body”:“ bar”,“ userId”:1}

答案 2 :(得分:0)

假设您的请求是request = @“ {” title“:” foo“,” body“:” bar“,” userId“:1}”;

致电RunTestAsync(request); 运行这个JsonConvert.SerializeObject(request); 我确定它会失败,因为它无法序列化。如果是的话
可序列化类的某些对象

(可序列化的类请求)

尝试一下 var content = new StringContent(request,Encoding.UTF8,“ application / json”);

公共异步任务RunTestAsync(字符串请求) {     尝试     {         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;
}

}