我正在编写WCF服务,我需要使用Json消息,但是我不想为其维护数据协定类。想法是通过输入流或字符串使用它,然后对其进行序列化并将其传递到另一个端点。我可以读取它,但输入始终为null。不确定是否有一种方法可以使用动态DataContract。我可以发送序列化的文本Json字符串很好,但是我不希望客户只向我发送原始的json消息,因此我可以将其传递给序列化到另一个端点。是否可以不使用DataContract?
如果消息是通过application / json发送的,则sMessageIn始终为空
[OperationContract]
[WebInvoke(Method = "POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Wrapped,
UriTemplate = "/test"
)]
String RestMessage(String sMessageIn);
使用JSON(应用程序/ json)模式通过邮递员通过线路发送的输入Json。
{
"test": {
"Code": "t",
"Type": "cr"
}
}
答案 0 :(得分:1)
是的。有一个解决方案。您可以使用此类作为输入,然后将其动态值传递给它。但不幸的是,您无法将嵌套的JSON对象传递给它。
[Serializable]
public class WebServiceDictionary : ISerializable
{
public Dictionary<string, string> Entries { get; }
public WebServiceDictionary()
{
Entries = new Dictionary<string, string>();
}
public WebServiceDictionary(SerializationInfo info, StreamingContext context)
{
Entries = new Dictionary<string, string>();
foreach (var entry in info)
Entries.Add(entry.Name, entry.Value.ToString());
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
foreach (var entry in Entries)
info.AddValue(entry.Key, entry.Value);
}
}
然后您按如下方式定义您的方法:
[OperationContract]
[WebInvoke(Method = "POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "/test"
)]
String RestMessage(WebServiceDictionary sMessageIn);
现在您可以传递任何您想要的东西。像这样的东西:
{ “代码”:“ t”, “类型”:“ cr” }
您可以像这样访问Dictionary对象中的参数:
sMessageIn.Entries[Code]