PostAsJsonAsync似乎没有发布身体参数

时间:2017-12-14 15:09:37

标签: c# json asp.net-mvc rest azure-logic-apps

我创建了一个公开REST端点的Azure逻辑应用程序。

当我通过邮递员调用它时,以下JSON正文工作正常。

{
   "to": "ggtest@yahoo.com",
   "subject": "Hello there",
   "message": "Hello there!!!!!"
}

我能够很好地看到传入的请求

{
    "headers": {
        "Cache-Control": "no-cache",
        "Connection": "keep-alive",
        "Accept": "*/*",
        "Accept-Encoding": "gzip,deflate",
        "Host": "maskedout.northcentralus.logic.azure.com:443",
        "User-Agent": "PostmanRuntime/6.4.1",
        "Content-Length": "99",
        "Content-Type": "application/json"
    },
    "body": {
        "to": "ggtest@yahoo.com",
        "subject": "Hello there",
        "message": "Hello there!!!!!"
    }
}

但是,当我尝试使用此代码使用C#PostAsJsonAsync进行相同的调用时:

        var email = new Email
        {
            to = "gg@live.com.sg",
            subject = "from webapp",
            message = "hello world"
        };
        var client = new HttpClient();
        var uri = "maskedout";
        var response = await client.PostAsJsonAsync<Email>(uri, email);

我能够成功调用我的REST端点,但它不包含正文

这是我看到的传入请求:

{
    "headers": {
        "Connection": "Keep-Alive",
        "Transfer-Encoding": "chunked",
        "Host": "maskedout.northcentralus.logic.azure.com",
        "x-ms-request-root-id": "9e5513c2-43961642a3688718",
        "x-ms-request-id": "|9e5513c2-43961642a3688718.1.",
        "Request-Id": "|9e5513c2-43961642a3688718.1.1.",
        "Content-Type": "application/json; charset=utf-8",
        "Content-Length": "0"
    }
}

我在这里缺少什么?与邮递员相比,我的C#代码有什么不同?

3 个答案:

答案 0 :(得分:1)

我也遇到了这个问题。该问题似乎是Content-Length标题。在Postman中,它是内容的长度,但是使用HttpClient,长度为0,所以我猜测端点忽略了主体,因为它被告知它是空的。

我创建了自己的扩展来解决这个问题:

public static async Task<HttpResponseMessage> PostJsonAsync<T>(
        this HttpClient client,
        string requestUri,
        T value)
    {
        var data = JsonConvert.SerializeObject(value);
        var content = new StringContent(data,
                                        Encoding.UTF8,
                                        MimeTypes.Json);
        Debug.WriteLine(client.BaseAddress + requestUri);
        return await client.PostAsync(requestUri,
                                      content)
                           .WithRequestTimeout()
                           .ConfigureAwait(false);
    }

答案 1 :(得分:0)

我刚刚遇到了同样的问题。似乎在使用默认的 % 扩展方法时 content-length 标头设置为 0,这会导致服务器忽略请求正文。

我的解决方案是安装使用新的 PostAsJsonAsync 序列化程序的 System.Net.Http.Json nuget 包。

当您添加 System.Text.Json 时,您应该能够正确使用新的扩展方法 using System.Net.Http.Json;(设置 PostAsJsonAsync 标头)。

content-length

答案 2 :(得分:-1)

默认情况下,system.js标头属性应为TransferEncodingChunked

然而,试试这个:

false