【问题标题】:Receive multiple objects for a POST request in Restfull WCF service with JSON使用 JSON 在 Restfull WCF 服务中接收 POST 请求的多个对象
【发布时间】:2013-11-20 10:10:52
【问题描述】:

将 2 个对象序列化为流并附加到 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\"}

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

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

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

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

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

【问题讨论】:

  • 这个问题类似于stackoverflow.com/questions/15804588/… 但是,没有对该问题的回应这就是为什么作为一个单独的问题发布,其中包含有关我的方案的更多详细信息

标签: json wcf rest post


【解决方案1】:

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

客户:

            // 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);
    }

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多