我正在尝试向服务器发送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
及其null
是length
!! < / p>
答案 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;
}
}