Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# web api:操作参数为空_C#_Asp.net Web Api2_Postman - Fatal编程技术网

C# web api:操作参数为空

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) {

我有一个简单的web api,但当我用Postman测试它时,方法参数为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变量包含字符串。Empty
s
是空的,因为内容流指针已经在流的末尾,因为框架已经读取了它并尝试填充参数
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;
}