[我正在尝试找到一种使用JSON调用WCF方法并传递TimeSpan作为参数的方法,但我始终会从服务中收到“错误请求”响应。
这里是代码段服务界面:
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
TimeSpan GetTimeSpan(TimeSpan value);
服务电话:
String method = "GetTimeSpan";
String result = null;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + method);
request.KeepAlive = false;
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "application/json";
JsonSerializer serializer = new JsonSerializer();
TimeSpan ts = new TimeSpan(23, 59, 59);
String jsonString = JsonConvert.SerializeObject(ts);
String data = jsonString; //jsonString = "23:59:59"
//I have already tryed with {"value": "23:59:59"} and the result is the same, bad request.
request.ContentLength = data.Length;
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(data);
writer.Close();
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
result = reader.ReadToEnd();
response.Close();
这只是一个例子。当调用不带TimeSpan的服务时,一切正常。我需要使其工作,以便与以常规方式使用该服务的其他客户端保持兼容性。
响应:
远程服务器返回错误:(400)错误的请求。
我传递了错误的TimeSpan json表示形式吗?还是有一种方法可以定义当服务处理请求时如何反序列化TimeSpan?
提前感谢
WCF使用的TimeSpan
格式与Newtonsoft JSON序列化器(JSON.NET)使用的格式不同。您可以使用DataContractJsonSerializer
(DCJS)序列化一个TimeSpan实例,这将是WCF REST服务所需的格式。
下面的代码将打印出一些由JSON.NET和DCJS序列化的TimeSpan
值的格式:
public class StackOverflow_7178839
{
public static void Test()
{
foreach (var ts in new TimeSpan[] { new TimeSpan(23, 59, 59), new TimeSpan(3, 4, 5, 6), new TimeSpan(-4, 3, 4, 5, 333) })
{
Console.WriteLine("For TimeSpan value: {0}", ts);
Console.WriteLine(" {0}", Newtonsoft.Json.JsonConvert.SerializeObject(ts));
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(TimeSpan));
MemoryStream ms = new MemoryStream();
dcjs.WriteObject(ms, ts);
Console.WriteLine(" {0}", Encoding.UTF8.GetString(ms.ToArray()));
}
}
}
对于任何仍然对WCF序列化器有问题的人,我发现了这样的解决方案:使用您自己的格式化程序,但请确保清除所有格式化程序。
私人无效RegisterRoute(){var config = new WebApiConfiguration(){EnableHelpPage = true,EnableTestClient = true};config.Formatters.Clear();config.Formatters.Add(new JsonNetMediaTypeFormatter());config.MaxReceivedMessageSize = 2097151;config.MaxBufferSize = 2097151;RouteTable.Routes.SetDefaultHttpConfiguration(config);RouteTable.Routes.MapServiceRoute(“ sys”,config);}
您可以如下所述形成json并通过
{“ value”:“ PT19H”} =>传递19小时作为时间跨度值
{“ value”:“ PT19H15”} =>通过19小时,15秒作为时间跨度值
{“ value”:“ 23H59M59S”} =>将23小时59分59秒作为时间跨度值传递]