没有DataContract的WCF JSON服务

时间:2018-07-19 23:13:09

标签: c# .net wcf

我正在编写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"
    }
  }

1 个答案:

答案 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]