我创建了一个公开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#代码有什么不同?
答案 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