根据JSON规范,表示null值的正确方式是使用字面量
那么,为什么WCF返回一个空响应而不是
完整的重现示例:
null
。那么,为什么WCF返回一个空响应而不是
null
呢?这是一个错误还是行为有文档记录?完整的重现示例:
using System;
using System.ServiceModel;
using System.ServiceModel.Web;
[ServiceContract()]
public class Service1
{
[OperationContract(), WebGet(ResponseFormat = WebMessageFormat.Json)]
public string GetSomeString() { return "SomeString"; }
[OperationContract(), WebGet(ResponseFormat = WebMessageFormat.Json)]
public string GetNull() { return null; }
}
public class Host
{
public static void Main()
{
// Very simple WCF server
var host = new WebServiceHost(typeof(Service1), new Uri("http://localhost:8000/"));
host.AddServiceEndpoint(typeof(Service1), new WebHttpBinding() {
HostNameComparisonMode = HostNameComparisonMode.Exact
}, "");
host.Open();
Console.WriteLine("Service is running, press enter to quit...");
Console.ReadLine();
host.Close();
}
}
预期结果:
$ curl http://localhost:8000/GetSomeString && echo
"SomeString"
$ curl http://localhost:8000/GetNull && echo
null
$
实际结果:
$ curl http://localhost:8000/GetSomeString && echo
"SomeString"
$ curl http://localhost:8000/GetNull && echo
$
Content-Type: application/json
? - GSergWebServiceHost
中的硬编码逻辑引起的。如果我使用DataContractJsonSerializer
将null
字符串直接序列化,方法是通过以下方式执行:var ms = new MemoryStream(); new DataContractJsonSerializer(typeof(string)).WriteObject(ms, null); Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
,则结果是字符串null
,而不是空字符串,这正是期望的结果。 - dbc