Размещение сложных типов / HttpContent в WCF REST 4.0? - PullRequest
0 голосов
/ 01 сентября 2010

Меня беспокоит передача сложных объектов / любых других типов: потому что я всегда получаю неверный запрос ... Фрагмент кода ниже:

Служба:

[OperationContract]
[WebInvoke(UriTemplate = "saveXML/", Method="POST", BodyStyle= WebMessageBodyStyle.Bare)]
bool saveXML(XElement xmlString)
{
       return true;
}

=========

Клиент:

private HttpUrlEncodedForm frm = new HttpUrlEncodedForm();

frm.Add("CustomerCode", "123");
frm.Add("CustomerName", "Joseph");
frm.Add("Address", "4th Street Washington Ave. New York");
frm.Add("Country", "United States of America");

using (HttpResponseMessage response = m_RestHttpClient.Post("saveXML/", frm.CreateHttpContent()))
{
   response.EnsureStatusIsSuccessful();
}

или я пробовал это так:

var request = new XDocument(
              new XElement("Customer",
              new XElement("CustomerCode", "123"),
              new XElement("CustomerName", "Joseph"),
              new XElement("Address", "4th Street Washington Ave. New York"),
              new XElement("Country", "United States of America")));

 frm.Add("body", request.ToString());

.. оба способа не работали ....это просто пример, я хочу использовать сложные типы, потому что я буду передавать не менее 50 параметров ... или если у вас есть какие-либо другие предложения, не стесняйтесь предлагать.

Спасибо

С наилучшими пожеланиямиРави

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Вы передаете сложный тип как XElement - это усложнит ситуацию. Просто передайте строго типизированный объект. Пусть сериализатор сделает всю работу за вас. Кроме того, вы получите автоматическую страницу справки, которая покажет вам, как именно вы должны сериализовать XML для вашего типа. Вот еще один ресурс для настройки службы WCF REST .

0 голосов
/ 03 сентября 2010

Услуги:

[OperationContract]
[WebInvoke(Method = "POST",BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Upload", ResponseFormat= WebMessageFormat.Xml, RequestFormat= WebMessageFormat.Xml)]
public void Upload(Stream data)
{
    StreamReader reader = new StreamReader(data);
    String res = reader.ReadToEnd();
}

=========

Клиент:

private HttpClient m_RestHttpClient = new HttpClient("http://localhost:17471/CustomerService/");


var form = new HttpUrlEncodedForm();
form.Add("CustomerCode", txtCustomerCode.Text);
form.Add("CustomerName", txtCustomerName.Text);
form.Add("ContactName", txtContactName.Text);
form.Add("Country", txtCountry.Text);
form.Add("PostalCode", txtPostalCode.Text);
form.Add("ClassTemplate", txtClassTemplate.Text); 
form.Add("BusinessType", cmbBusinessType.Text);
form.Add("IsProspect", cmbIsProspect.Text);

using (HttpResponseMessage response = m_RestHttpClient.Post("Upload", frm.CreateHttpContent()))
{
    response.EnsureStatusIsSuccessful();
}

===============================

Вывод текстового файла, который был написан (кстати, это вообще не имеет ограничений: я могу передать столько параметров, сколько захочу):

CustomerCode=CUST001&CustomerName=Customer+One&ContactName=Fuebo+Gacia&Country=France&PostalCode=8234994&ClassTemplate=Class+Template&BusinessType=Wholesale&IsProspect=True

--- По сути, сейчас меня беспокоит вопрос о том, как правильно получить эти значения. Я попытался передать строку xml, но в ней также были значения с разными форматами символов, может быть, это нужно проанализировать или что-то в этом роде. Надеюсь, это поможет нам решить проблему.

Спасибо

...