【发布时间】:2019-03-28 03:19:01
【问题描述】:
我正在尝试将包含来自 Razor Pages 应用程序的 JSON 的请求发布到期望 Json WebMessageFormat 和 Bare BodyStyle 的 WCF 服务端点。JSON 通过 Postman 传递得很好,但当我通过 http-client 发送它时却没有。 Wireshark 还在 http-client 生成的数据包中显示了一些围绕 JSON 的额外字节,这些字节在 Postman 数据包中不存在。对于 Postman 数据包,Wireshark 还将其报告为 line-based text data: application/json。 .Net 数据包是JavaScript Object Notation: application/json。
这是我将 JSON 发送到 WCF 端点的 C# 代码:
var client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:8000");
dynamic foo = new ExpandoObject();
foo.position = 1;
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(foo), System.Text.Encoding.UTF8, "application/json");
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:8000/WCFService/ControllerV1/PostJSON");
request.Headers.Add("cache-control", "no-cache");
request.Headers.Add("Accept", "*/*");
request.Headers.Add("Connection", "keep-alive");
request.Content = content;
try
{
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
}
catch (HttpRequestException e)
{
Console.WriteLine(e.Message);
}
这是我的 WCF 端点声明:
[OperationContract, WebInvoke(Method="POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
void PostJSON(string jsonString);
我希望数据包从服务器产生相同的响应,但是,当数据包由邮递员构建时,看起来相同的字符串会产生响应 200,而当由 .Net 构建时会产生响应 400。我显然在这里遗漏了一些微妙的东西,但我似乎无法梳理出来。
【问题讨论】:
-
HttpClient 甚至不是 JSON 是什么。它只是发布一个 StringContent。该字符串的内容由
JsonConvert.SerializeObject(foo)生成。我怀疑真正的问题是使用 WCF REST 服务而不是常见的选择 Web API。 WCF REST 是一种权宜之计,很快被 Web API 取代 -
HttpClient 或 Json.NET 都没有问题。大多数(如果不是全部).NET Core 项目都使用它们来调用 HTTP 服务。 Json.NET 是 Web API 和 ASP.NET Core 的默认序列化程序。
-
@PanagiotisKanavos 我同意最初的问题似乎表明我认为问题出在 http-client 上。我更新了问题的标题和正文,以更好地反映我遇到的实际问题。
标签: wcf asp.net-core dotnet-httpclient razor-pages