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 経由で送信されたヘッダーに実際の違いは見られません。

4

1 に答える 1

4

文字列を送信する前に、WebClient でEncodingプロパティを設定してみてください。指定していないので、デフォルトでASCIIになっていると思います。UploadStringリファレンス ページからの引用。

文字列をアップロードする前に、このメソッドは Encoding プロパティで指定されたエンコーディングを使用して文字列を Byte 配列に変換します。このメソッドは、文字列の送信中にブロックします。文字列を送信し、サーバーの応答を待っている間に実行を続行するには、UploadStringAsync メソッドのいずれかを使用します。

 webClient.Encoding = Encoding.UTF8;
于 2009-03-14T13:42:21.377 に答える