将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);
我认为当您将数据POST到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);
}