2013-01-21 39 views
0

我在做一个需要通过客户端接收复杂数据的WCF REST服务。我知道我不能通过GET方法传递复杂的数据,所以我使用POST来发送它。将复杂数据传递给REST WCF POST方法

我有这样的方法定义...

[WebInvoke (UriTemplate="/test/item", Method="POST", 
     RequestFormat=WebMessageFormat.Json, 
     ResponseFormat=WebMessageFormat.Json, 
     BodyStyle=WebMessageBodyStyle.Wrapped)] 
    [OperationContract] 
    string TestMethod(InItem item); 

而且我想消费这样一个.NET控制台客户端...

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://myIP:port/test/item"); 
request.Credentials = CredentialCache.DefaultCredentials; 
request.Method = "POST"; 

InItem item = new InItem() 
{ 
    Quantity = 2, 
    BougthQuantity = 2, 
    Code = "9998", 
    Date = DataTime.Now 
}; 

string itemToSend = JsonConvert.SerializeObject(item); 
byte[] byteData = Encoding.UTF8.GetBytes(itemToSend); 
request.ContentLength = byteData.Length; 
request.ContentType = "application/json;"; 

Stream stream = request.GetRequestStream(); 
stream.Write(byteData, 0, byteData.Length); 
stream.Close(); 

WebResponse response = request.GetResponse(); 
stream = response.GetResponseStream(); 

但是,当我调用TestMethod上的'item'参数的服务方法始终为空,我错过了什么或者我做错了什么?

在此先感谢...

+0

Pe可能是因为当你将这个序列化到JSON然后将它粘贴到你的请求流中时,你实际上并没有传递一个项目,只是一个匿名JSON对象。试着包装它: itemToSend =“{item:”+ JsonConvert.SerializeObject )+ “}”; 虽然我可能完全错了:() –

+0

这些是否都使用InItem的相同版本的库? –

+0

也是InItem标有Seri​​alizable属性? –

回答

0

谢谢大家对你的答案,我才意识到这个错误是什么,首先...或当然,我们可以使用语句

"{\"item\":"+serialized object + "}" 

但它的有点凌乱,我们可以改变BodyStyle到Bare。

接下来,我用的是相同的库,因为通过项目实体股份,也我申请ContractSerializer到实体...

的错误是关于“日期时间”参数的序列化,因为jsonSerializer使用Newtonsoft串行和DataContractJsonSerializer使用的格式这种

日期= 2013-01-21T14:29:41.2211548-06:00(显示在小提琴手)

所以,我只是改变日期时间字符串,它工作正常。 ..