Форматировать данные POST с помощью HttpWebRequest - PullRequest
1 голос
/ 07 мая 2011

У меня есть веб-сервис с двумя операциями. Одна операция использует GET, а другая - POST. Обратите внимание, что я не эксперт по веб-сервисам, поэтому, пожалуйста, не стесняйтесь указывать на то, что я делаю неправильно. Несмотря на это, у меня есть следующие операции в моей службе WCF:

[WebGet(UriTemplate = "/GetPropertyValue/{propertyID}", ResponseFormat = WebMessageFormat.Json)]
public string GetPropertyValue(string propertyID)
{
  return RetrievePropertyValueFromDatabase(propertyID);
}

[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string SetPropertyValue(string propertyID, string propertyValue)
{
  return SetPropertyValueInDatabase(propertyID, propertyValue);
}

Эти две операции вызываются моим приложением Silverlight Phone. Этот вызов должен использовать HttpWebRequest по соображениям производительности. Чтобы сделать этот звонок, вот что я делаю:

// Getting Property Value
string url = GetUrl(propertyID);
// url looks something like http://mydomain.com/myservice.svc/GetPropertyValue/2
WebRequest request = HttpWebRequest.Create(url);
request.BeginGetResponse(new AsyncCallback(GetProperty_Completed), request);

// Elsewhere in my code

// Setting property value
string url = GetUrl(propertyID, propertyValue);
// url looks something like http://mydomain.com/myservice.svc/SetPropertyValue/2/newValue
WebRequest request = HttpWebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.BeginGetResponse(new AsyncCallback(SetProperty_Completed), request);

Мои URL генерируются правильно. Однако работает только запрос GetProperty. Когда я копирую и вставляю URL-адрес GetProperty в браузер, он работает. Когда я пытаюсь выполнить SetProperty, я получаю сообщение об ошибке, сообщающее, что конечная точка не найдена. Я понимаю, что браузер всегда использует GET, так что это имело бы смысл. Но из HttpWebRequest я получаю сообщение об ошибке «Удаленный сервер возвратил ошибку: NotFound». Что я делаю не так?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 07 мая 2011

Вы забыли объявить UriTemplate в атрибуте [WebInvoke]. В соответствии с примером URL в вашем фрагменте кода он должен быть "SetPropertyValue/{propertyID}/{propertyValue}". Вот почему он возвращается с 404.

Кроме того, вы, конечно, не хотите использовать «application / x-www-form-urlencoded» в качестве типа содержимого запроса. WCF не имеет MessageFormatter для этого. Кроме того, вы в любом случае даже не отправляете контент для этого запроса (WCF будет использовать UriTemplateDispatchFormatter). Следовательно, вы также можете удалить свойства RequestFormat и BodyStyle. Оставьте свойство ResponseFormat там, только если вы действительно ожидаете, что Json вернется!

0 голосов
/ 07 мая 2011

Я думаю, что самая первая проблема заключается в том, что WCF не поддерживает тип контента application / x-www-form-urlencoded (я не уверен, что это единственная проблема, которая у вас есть).Некоторые обходные пути могут быть следующими:

...