C# web api:操作参数为空
我有一个简单的web api,但当我用Postman测试它时,方法参数为null。我看了很多类似题目的问题,但没有找到答案 以下是我的控制器操作:C# web api:操作参数为空,c#,asp.net-web-api2,postman,C#,Asp.net Web Api2,Postman,我有一个简单的web api,但当我用Postman测试它时,方法参数为null。我看了很多类似题目的问题,但没有找到答案 以下是我的控制器操作: [HttpPost] public Member Create([FromBody] string payload) { var s = Request.Content.ReadAsStringAsync(); if (payload == null) {
[HttpPost]
public Member Create([FromBody] string payload)
{
var s = Request.Content.ReadAsStringAsync();
if (payload == null)
{
throw new ArgumentNullException(nameof(payload));
}
Console.WriteLine(payload);
Console.WriteLine(s);
return null;
}
这是我的邮递员配置:
在headers选项卡中,我将内容类型
添加为application/json
当我调试这个时,payload
变量总是null
,字符串s
包含如下内容
Id = 98, Status = RanToCompletion, Method = "{null}", Result = ""
那么我做错了什么呢?布达
HttpContent.ReadAsStringAsync
返回一个Task
,因此是s
字符串的值
您必须更新操作以使其异步:
[HttpPost]
public async Task<Member> Create([FromBody] string payload)
{
var s = await Request.Content.ReadAsStringAsync();
if (payload == null)
{
throw new ArgumentNullException(nameof(payload));
}
Console.WriteLine(payload);
Console.WriteLine(s);
return null;
}
[HttpPost]
公共异步任务创建([FromBody]字符串负载)
{
var s=wait Request.Content.ReadAsStringAsync();
如果(有效负载==null)
{
抛出新的ArgumentNullException(nameof(payload));
}
控制台写入线(有效载荷);
控制台。写入线(s);
返回null;
}
您应该在模型(对象)中包装字符串:
类模型
{
公共字符串有效负载{get;set;}
}
[HttpPost]
公共异步任务创建([FromBody]模型)//在任务中包装成员并添加异步关键字
{
var s=await Request.Content.ReadAsStringAsync();//在此处添加await
如果(model.payload==null)
{
抛出新的ArgumentNullException(nameof(model.payload));
}
控制台写入线(型号有效载荷);
控制台。写入线(s);
返回null;
}
如果您不想使用model,请尝试只发送普通字符串,如
“some payload”
,不要将其包装在json
中,当您将字符串(无json)放入正文中时会发生什么情况?阅读本文,您会发现在参数绑定中犯了错误。另一个错误是,当您试图以文本形式阅读内容时,输出的是任务,而不是任务的结果string@Donal如果我放一个简单的字符串,它就会工作。但是为什么呢?@BudaGavril查看我上一篇评论中的链接,并了解[FromBody]属性的用法。就是why@BudaGavril对于复杂类型,Web API尝试使用媒体类型格式化程序从消息体读取值。JSON被解释为复杂类型。如果你的参数是一个字符串,你应该在正文中放一个字符串。但是。。。为什么?我看不出有什么问题logic@BudaGavril根据您的邮递员,请求主体显示您发送的是一个json对象(复杂模型),而不是一个字符串,该字符串是操作的内容expects@BudaGavril,因为json
需要控制器中的模型。您发送的json
,不是一个普通的字符串
我已经更新了代码并使用了wait,但是我的s变量包含字符串。Emptys
是空的,因为内容流指针已经在流的末尾,因为框架已经读取了它并尝试填充参数
class Model
{
public string payload {get;set;}
}
[HttpPost]
public async Task<Member> Create([FromBody] Model model) // wrap Member in Task and add async keyword
{
var s = await Request.Content.ReadAsStringAsync(); // add await here
if (model.payload == null)
{
throw new ArgumentNullException(nameof(model.payload));
}
Console.WriteLine(model.payload);
Console.WriteLine(s);
return null;
}