【问题标题】:How to Pass Dynamic Json Object (data) to wcf ResTful Services?如何将动态 Json 对象(数据)传递给 wcf RestTful 服务?
【发布时间】:2013-07-17 23:14:22
【问题描述】:

所以假设我有一个如下的 Json 数据集,即使该数据的这个 json 数据(模型或结构)不是静态的,并且它会根据每次调用而改变,我如何将通用 Json 数据集传递到WCF代码的POST方法?

{
  "experience": 14746,
  "status": true,
  "name": "Aaron",
  "uuid": "3123"
}

我想从正文中使用 POSTMAN 或 SoapUI?

public object PostData(string id, [FromBody] JObject data)
{
 //Do Something with data
}


public interface IPostService
{
    [OperationContract(Name = "PostData")]
    [WebInvoke(Method = "POST", UriTemplate = "/PostData?id={id}&data={data}")]
    object PostData(string id,[FromBody] JObject data);

}

任何帮助将不胜感激

【问题讨论】:

    标签: c# json wcf rest


    【解决方案1】:

    当你在 UriTemplate 属性中指定一个变量 data 时,你是说值在查询字符串中,而不是在 BODY 中,默认情况下是 WebInvokeMethod 的 HTTP 方法 属性是 POST。

    public object PostData(string id, string data)
    {
        //Do Something with data
    }
    
    
    public interface IPostService
    {
        [OperationContract(Name = "PostData")]
        [WebInvoke(UriTemplate = "/PostData?id={id})]
        object PostData(string id, string data);
    }
    

    然后您可以使用 Newtonsoft 库将 Json 格式的字符串值解析为具有动态属性的对象。您可以将 Newtonsoft 库与 Nuget 一起使用。

    要了解如何使用Newtonsoft 解析动态对象,请单击here

    【讨论】:

    • 能否请您提供说明,如何使用 POSTMAN 或 SOAPUI 调用此服务?
    • 你是指用POSTMAN还是SOAPUI调用SOAP服务?
    • 是WCF休息服务!!不可能吗?
    • 这可以是 WCF REST 或 WCF SOAP 服务,取决于 svc 文件中的 Factory 属性值。对于 WCF REST 工厂 = System.ServiceModel.Activation.WebServiceHostFactory。祝你好运。
    【解决方案2】:

    补充我之前的回答。反序列化对象时,Newtonsoft 可以与 dynamic 一起使用。就是这样执行的。

    var results = JsonConvert.DeserializeObject<dynamic>(json);
    var experience= results.Experience;
    var status= results.Status;
    var name= results.Name;
    var uuid= results.Uuid;
    var dynamic_property= results.AnotherProperty;
    

    另一种方式。如果您知道要解析的类的所有可能属性。您可以使用 Newtonsoft.Json 的 JsonProperty 属性并使用强类型的 DeserializeObject。

    public class MyModel
    {
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public int experience {get;set;}
    
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public bool status {get;set;}
    
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string name {get;set;}
    
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string uuid {get;set;}
    
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public object property_1 {get;set;}
    
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public object property_2 {get;set;}
    
        ...
    }
    

    您可以提出请求:

    var httpRequest = WebRequest.Create(string.Format("baseurl" + "/PostData?id={0}", id));
    httpRequest.Method = "POST";
    httpRequest.ContentType = "application/json";
    httpRequest.ContentLength = data.Length;
    
    try
    {
        using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream()))
        {
            if (!string.IsNullOrEmpty(data))
            {
                streamWriter.Write(data);
                streamWriter.Flush();
                streamWriter.Close();
            }
        }
    
        var response = httpRequest.GetResponse();
    }
    catch (Exception)
    {}
    

    【讨论】:

    • 我的问题不是反序列化,我知道那部分怎么做,问题是如何首先传递信息,我有两个参数(id和data)对吗? “数据”是一个巨大的字符串,我不想在 URL 中将数据作为参数传递,我需要从消息 BODY 传递数据,但我不知道该怎么做或将内容类型设置为什么,谢谢
    • 如果你用的是C#,那就有答案了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多