【发布时间】:2012-10-06 16:20:19
【问题描述】:
在我正在进行的项目中,我们需要有一个可以包含一些未定义 JSON 的 DataContract。
DataMember 是一些仅对客户端有意义的 JSON。我们希望允许客户端向我们发送我们不知道的 json。
例子:
public class Contract
{
[DataMember]
public int clientId;
[DataMember]
public string json;
}
显然,定义这样的合同需要客户端像这样转义 json:
{
"clientId":1,
"json": "{\"test\":\"json\"}"
}
显然,这不是我们需要的。客户端应该发送给我们的 json 应该是这样的:
{
"clientId":1,
"json": {"test":"json"}
}
我们调查的可能解决方案:
- 使用 Stream 作为请求正文的合同参数。工作,但把工作放在我们这边,而不是使用框架。
- 将“json”定义为动态对象。不工作。无法正确写入属性。
- 使用 Newtonsoft 库,更改 WCF 端点中的默认合同序列化程序,以将所有输入序列化为 JObject。我们还需要处理请求的序列化,这会导致我们的应用程序出现问题。我们宁愿避免这种方式。
有没有人可以解决这个问题?
编辑
该服务提供其他 json 资源。它使用 webHttpBinding 定义了一个端点。 操作是这样定义的(为了简单起见):
[WebInvoke(Method = "POST", UriTemplate = "...", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
Stream Create(Contract c);
此外,该服务使用以下属性进行装饰:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
谢谢。 杰夫
【问题讨论】:
-
听起来您的客户端正在将您的服务输出作为soap/XML 使用,并且您正试图通过soap 消息传输JSON 字符串。您是否考虑过为soap/XML 和JSON 响应保留单独的端点。您可以将标准 DataContact 端点按原样保留在当前绑定中,并添加一个新的
WebHttpBinding端点以使用 JSON 字符串进行响应。是的,它增加了一个调用,但它会简化你的合同。 -
@Sixto Saez:我们不提供肥皂。我们有 1 个带有 webHttpBinding 的端点,仅支持 REST json。
-
您会使用客户端在请求中发送的未定义 JSON 吗?
标签: c# json wcf serialization