我有一个使用webHttpBinding端点公开的WCF服务。
[OperationContract(IsOneWay = true)]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "/?action=DoSomething&v1={value1}&v2={value2}")]
void DoSomething(string value1, string value2, MySimpleObject value3);
理论上,如果我这样称呼,前两个参数(value1& value 2)取自Uri,最后一个(value3)应该从请求正文中反序列化。
假设我使用Json作为RequestFormat,在发送之前将MySimpleObject实例序列化为请求正文的最佳方法是什么?例如,这似乎不起作用:
HttpWebRequest sendRequest = (HttpWebRequest)WebRequest.Create(url);
sendRequest.ContentType = "application/json";
sendRequest.Method = "POST";
using (var sendRequestStream = sendRequest.GetRequestStream())
{
DataContractJsonSerializer jsonSerializer =
new DataContractJsonSerializer(typeof(MySimpleObject));
jsonSerializer.WriteObject(sendRequestStream, obj);
sendRequestStream.Close();
}
sendRequest.GetResponse().Close();
答案 0 :(得分:0)
我做的一件事就是将WebResponse放入using
块:
using (var response = sendRequest.GetResponse())
{
}
如果Close
在您的代码中引发异常,我会担心会发生什么。
另外,您是否记录例外情况?您可能想尝试:
try
{
using (var response = sendRequest.GetResponse())
{
}
}
catch (Exception ex) {
Console.WriteLine(ex.ToString()); // Or however you want to display it
throw;
}
这将确保您知道响应的任何问题(例如非200 HTTP状态)。
答案 1 :(得分:0)
我现在使用Json序列化(通过DataContractJsonSerializer和Json.Net)并使用XmlSerializer。
奇怪的是,web invoke属性中的RequestFormat = WebMessageFormat.Xml属性似乎被忽略,即无论此设置如何,入站消息似乎都是从xml或json反序列化的。