WCF Post/WebRequest работает, а WebClient — нет.

У меня есть служба WCF, объявленная следующим образом:

[OperationContract, XmlSerializerFormat]
[WebInvoke(UriTemplate = "ProessUpload",
   BodyStyle = WebMessageBodyStyle.Bare,
   RequestFormat = WebMessageFormat.Xml)]
void ProcessUpload(ProductConfig stream);

Я пытаюсь вызвать эту службу с помощью WebClient, но всегда получаю ответ 400 (BadRequest) с сервера. Однако, если я использую HttpWebRequest, WCF использует мое сообщение и правильно отвечает 200. Я также могу успешно создать запрос с помощью Fiddler для вызова службы WCF.

Код веб-клиента

WebClient webClient = new WebClient();
webClient.Headers.Add("Content-Type", "application/xml");//; charset=utf-8
try
{
  string result = webClient.UploadString("http://jeff-laptop/SalesAssist.ImageService/Process", "POST", data2);
}
  catch (Exception ex)
{
  var e = ex.InnerException;
}

Код HttpWebRequest

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://jeff-laptop/SalesAssist.ImageService/Process");
request.ContentType = "application/xml";
request.Method = "POST";
request.KeepAlive = true;

using (Stream requestStream = request.GetRequestStream())
{
  var bytes = Encoding.UTF8.GetBytes(data2);
  requestStream.Write(bytes, 0, bytes.Length);
  requestStream.Close();
}

var response = (HttpWebResponse)request.GetResponse();
var abc = new StreamReader(response.GetResponseStream()).ReadToEnd();

Отправляемый XML

var data2 = @"<Product><Sku>3327</Sku><NameProduct</Name><Category>Bumper</Category><Brand Id='3'><Collection>14</Collection></Brand></Product>";

Почему этот HttpWebRequest работает, а WebClient — нет? Я не вижу реальной разницы в отправленных заголовках через Fiddler.


person Community    schedule 14.03.2009    source источник
comment
Я думаю, что это сводится к специальным символам в строке элемента. Если я передам Comfort® в названии продукта, он будет работать с использованием HttpWebRequest, однако не будет работать с WebClient. Выполняет ли WebClient кодирование перед отправкой?   -  person    schedule 14.03.2009
comment
у меня была другая проблема, но этот вопрос дал мне возможность исправить мой код.   -  person Mubashar    schedule 23.07.2012


Ответы (1)


Попробуйте установить свойство Encoding в WebClient. перед отправкой строки. Поскольку вы не указываете его, я подозреваю, что по умолчанию используется ASCII. Цитата из справочной страницы UploadString.

Перед загрузкой строки этот метод преобразует ее в массив байтов, используя кодировку, указанную в свойстве Encoding. Этот метод блокирует передачу строки. Чтобы отправить строку и продолжить выполнение, ожидая ответа сервера, используйте один из методов UploadStringAsync.

 webClient.Encoding = Encoding.UTF8;
person tvanfosson    schedule 14.03.2009