WCF Post / WebRequest 可用 - WebClient 不行

3

我有一个声明如下的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 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 中看不出发送的头部有什么实质性的区别。

我认为问题出在元素字符串中的特殊字符上。如果我在产品名称中传递"Comfort®",使用HttpWebRequest可以正常工作,但使用WebClient时无法正常工作。WebClient在发送前是否执行编码? - Jeff
1
我遇到了不同的问题,但这个问题给了我纠正代码的机会。 - Mubashar
1个回答

4
尝试在发送字符串之前设置WebClient的编码属性。由于您没有指定它,我怀疑它默认为ASCII。引用自UploadString 参考页面

在上传字符串之前,此方法将其转换为使用Encoding属性指定的编码的字节数组。此方法在传输字符串时阻塞。要发送一个字符串并继续执行,同时等待服务器的响应,请使用其中一个UploadStringAsync方法。

 webClient.Encoding = Encoding.UTF8;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接