我正在尝试将包含JSON的请求从Razor Pages应用程序发布到期望Json WebMessageFormat和Bare BodyStyle的WCF服务端点.JSON通过Postman传递得很好,但是当我通过http-client发送它时却没有。 Wireshark还在http-client生成的数据包中显示JSON周围的一些额外字节,这些字节在Postman数据包中不存在。 Wireshark还将此报告为邮件包的line-based text data: application/json
。 .Net包是JavaScript Object Notation: application/json
。
这是我的C#代码,用于将JSON发送到WCF端点:
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时产生响应400。我显然遗漏了一些微妙的东西,但我似乎无法取笑它。
有2个可能的BodyStyle
用于请求和响应,包裹或裸露。当您指定包装的主体样式时,WCF
服务需要传递一个有效的json,在您的情况下
//note that property name is case sensitive and must match service parameter name
{
"jsonString": "some value"
}
当你指定裸格式时,服务只需要普通的字符串值(如果是原始类型的话)就像这样的请求
"some value"
当您像这样序列化对象时
dynamic foo = new ExpandoObject();
foo.position = 1;
string result = JsonConvert.SerializeObject(foo);
result
包含以下json
{
"position":1
}
对应于包装格式,服务返回400: Bad Request
。你需要做的就是将这个json变成有效的json string
值
"{\"position\":1}"
它可以通过重复JsonConvert.SerializeObject
调用来完成
dynamic foo = new ExpandoObject();
foo.position = 1;
string wrapped = JsonConvert.SerializeObject(foo);
string bare = JsonConvert.SerializeObject(wrapped);
var content = new StringContent(bare, System.Text.Encoding.UTF8, "application/json");