Сериализация объекта в тело запроса WCF с использованием webHttpBinding - PullRequest
0 голосов
/ 04 августа 2009

У меня есть служба WCF с конечной точкой webHttpBinding.

[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);

Теоретически, если я это называю, первые два параметра (значение 1 и значение 2) берутся из Uri, а последний (значение 3) должен десериализоваться из тела запроса.

Если я использую 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 голосов
/ 05 августа 2009

Теперь у меня это работает, используя сериализацию Json (через DataContractJsonSerializer и Json.Net) и использование XmlSerializer.

Странно то, что свойство RequestFormat = WebMessageFormat.Xml в атрибуте веб-вызова игнорируется, т. Е. Входящие сообщения, похоже, десериализованы из xml или json независимо от этого параметра.

0 голосов
/ 04 августа 2009

Одна вещь, которую я бы сделал по-другому - это поместить 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;
}

Это гарантирует, что вы знаете о любых проблемах с ответом (например, не HTTP-статус HTTP).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...