【发布时间】:2013-01-21 19:42:42
【问题描述】:
我正在做一个需要通过客户端接收复杂数据的 WCF REST 服务。我知道我不能通过 GET 方法传递复杂的数据,所以我使用 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' 参数始终为空,是我遗漏了什么还是我做错了什么?
提前谢谢...
【问题讨论】:
-
可能是因为当您将其序列化为 JSON 然后将其粘贴到您的请求流中时,您实际上并没有传递一个项目,只是一个匿名 JSON 对象。尝试包装它: itemToSend="{item: "+JsonConvert.SerializeObject(item)+"}";不过我可能完全错了:()
-
它们是否都使用相同版本的 InItem 库?
-
InItem 是否也标有 Serializable 属性?
-
@RyanBennett 唯一需要
Serializable的序列化程序是BinaryFormatter。没必要。