WCF使用HTTP 400响应来自Razor Pages应用程序的序列化JSON字符串

问题描述 投票:0回答:1

我正在尝试将包含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。我显然遗漏了一些微妙的东西,但我似乎无法取笑它。

wcf asp.net-core dotnet-httpclient razor-pages
1个回答
0
投票

有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");
© www.soinside.com 2019 - 2024. All rights reserved.