使用webHttpBinding将对象序列化为WCF请求的主体

时间:2009-08-03 21:34:04

标签: c# .net wcf http serialization

我有一个使用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();

2 个答案:

答案 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反序列化的。