【发布时间】:2015-10-21 16:16:10
【问题描述】:
我必须创建一个 PUT RESTful WCF 服务,它的 URI 模板类似于:
/rs/close_copy/{user_token}?term={term}&brand={brandname}
向我们发送的请求具有这种格式的 JSON 正文:
“acc”:
“counters”:[
{“format”:
“ink”:
“ctr”:
“duplex”: },
{…}]
但问题是,上面的"counters" 参数并不总是像预期的那样以 JSON 对象数组的形式出现。当"counter" 中只有一个元素时,请求以单个 JSON 对象的形式出现,而不是作为具有一个元素的 JSON 对象列表。
调用我们服务的是第三方,他们无法更改他们的请求。我在 WCF 中实现了如下内容:
[WebInvoke(Method = "PUT", ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "/rs/close_copy/{user_token}?term={term}&brand={brandname}")]
JsonResponse EndSession(string user_token, string term, string brandname, EndSessionRequest request);
EndSessionRequest 在哪里:
[DataContract]
public class EndSessionRequest
{
[DataMember]
public string acc { get; set; }
[DataMember]
public IEnumerable<PageDetails> counters { get; set; }
}
而PageDetails 是:
[DataContract]
public class PageDetails
{
[DataMember]
public string format { get; set; }
[DataMember]
public string ink { get; set; }
[DataMember]
public int ctr { get; set; }
[DataMember]
public bool duplex { get; set; }
}
上述实现的问题是,当counters 有一个元素时,向我们提出请求:
{"acc":"ramaccnz","counters":{"ctr":"2","duplex":"false","format":"A4","ink":"bw"}}
但根据我们的实现,请求应为:
{"acc":"ramaccnz","counters":[{"ctr":"2","duplex":"false","format":"A4","ink":"bw"}]}
在其他情况下,当请求包含多个元素时,我们的服务会按预期工作。
有没有办法在 WCF 实现中处理这个问题?
【问题讨论】:
-
您的代码是正确的,问题是第三方客户端没有正确调用您的服务,尊重您的服务合同。