使用JSON在Restfull WCF服务中接收POST请求的多个对象 [英] Receive multiple objects for a POST request in Restfull WCF service with JSON

查看:136
本文介绍了使用JSON在Restfull WCF服务中接收POST请求的多个对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

将2个对象序列化为流并将其附加到HttpWebRequest

Serialized 2 objects into a stream and attached it to HttpWebRequest

    DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(OBJECT1));
    ser.WriteObject(stream1, controller);
    ser = new DataContractJsonSerializer(typeof(OBJECT2));
    ser.WriteObject(stream1, reader);
    stream1.position =0;

我的json字符串看起来像这样(在上面的代码之后): {\"Object1Parameter1\":\"2\"}{\"Object2Parameter1\":\"Added reader\",\"Object2Parameter2\":\"2\"}

My json string looks like this (after above code) : {\"Object1Parameter1\":\"2\"}{\"Object2Parameter1\":\"Added reader\",\"Object2Parameter2\":\"2\"}

甚至尝试将父级添加到名称分别为OBJECT1和OBJECT2的字符串中,但仍然没有在服务器上反序列化数据.

Even tried adding parent to this string with name OBJECT1 and OBJECT2 resp, but still data did not get deserialized at server.

在Rest服务中接收这样的数据没有问题

There is no problem in receiving the data like this at the Rest service

[OperationContract]
        [WebInvoke(Method = "POST",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "Controller")]
        string AddBothObjects(/*parameters of both objects listed*/);

如何在服务端以两个对象而不是单个参数接收此数据. 像这样:

How do I receive this data at the service end in both objects rather than individual parameters. Something like this:

[OperationContract]
            [WebInvoke(Method = "POST",
                RequestFormat = WebMessageFormat.Json,
                ResponseFormat = WebMessageFormat.Json,
                BodyStyle = WebMessageBodyStyle.Wrapped,
                UriTemplate = "Controller")]
            string AddBothObjects(Object1 obj1,Object2 obj2);

推荐答案

我认为,当您将数据发布到WCF服务时,应该将要发送的所有数据包装到一个对象(一个请求对象)中.这是示例代码,用来显示我在说什么

I think when you POST data to your WCF service, you should wrap all of the data you're sending into an object (1 request object). This is sample code to show what I'm talking about

客户:

            // declare ascii encoding
            ASCIIEncoding encoding = new ASCIIEncoding();
            string jsonObject1 = "{\"Object1Parameter1\":\"2\"}";
            string jsonObject2 = "{\"Object2Parameter1\":\"Added reader\",\"Object2Parameter2\":\"2\"}";


            byte[] data = encoding.GetBytes(jsonObject1 + jsonObject2);

            string url = "http://localhost:64273/Sparql.svc/TestForStack";

            string strResult = string.Empty;

            // declare httpwebrequet wrt url defined above
            HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(url);
            // set method as post
            webrequest.Method = "POST";
            // set content type
            webrequest.ContentType = "application/x-www-form-urlencoded";
            // set content length
            webrequest.ContentLength = data.Length;
            // get stream data out of webrequest object
            Stream newStream = webrequest.GetRequestStream();

            newStream.Write(data, 0, data.Length);
            newStream.Close();

            //Gets the response
            WebResponse response = webrequest.GetResponse();
            //Writes the Response
            Stream responseStream = response.GetResponseStream();

            StreamReader sr = new StreamReader(responseStream);
            string s = sr.ReadToEnd();

服务界面

[OperationContract]
    [WebInvoke(Method = "POST",
        UriTemplate = "TestForStack",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare)]
    Stream TestForStack(Stream request);

服务实施

public Stream TestForStack(Stream request)
    {
        StreamReader requestReader = new StreamReader(request);

        //data contains "{\"Object1Parameter1\":\"2\"}{\"Object2Parameter1\":\"Added reader\",\"Object2Parameter2\":\"2\"}"
        string data = HttpUtility.UrlDecode(requestReader.ReadToEnd());

        //Splits the two json objects into a list of json objects
        var output = data.Split(new[] { '{', '}' }, StringSplitOptions.RemoveEmptyEntries)
              .Select(x => "{" + x + "}")
              .ToList();

        //Parse your json object
        foreach (var entry in output)
        {
            var parsedObject = JsonConvert.DeserializeObject<JObject>(entry);
            foreach (var dataset in parsedObject.Properties())
            {
                Console.WriteLine(dataset.Name);
            }
        }

        byte[] htmlBytes = Encoding.UTF8.GetBytes("Done");

        return new MemoryStream(htmlBytes);
    }

这篇关于使用JSON在Restfull WCF服务中接收POST请求的多个对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆