2009-03-14 4 views
3

私は、WCFサービスは、宣言しているん:WCFポスト/ WebRequestクラスワークス - 次のようにWebクライアントではない

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

私は、Webクライアントを使用してこのサービスを呼び出すためにしようとしていますが、私はいつも、応答400(BadRequest)を取得していますから、サーバー。しかし、私がHttpWebRequestを使用する場合、WCFは私の投稿を消費し、正しく200で応答します。また、WCFサービスを呼び出すためにFiddlerを使用してリクエストを構築することもできます。

Webクライアントコード

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(); 

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

を送られているXMLはなぜHttpWebRequestの作品やWebクライアントにはないということですか?フィドラーを介して送信されたヘッダーに実際の違いはありません。

+0

要素の文字列に特殊文字が降りてくると思います。製品名に「Comfort®」を渡すと、HttpWebRequestを使用して動作しますが、WebClientでは動作しません。 WebClientは送信前にエンコードを実行しますか? –

+1

私は別の種類の問題を抱えていましたが、この質問は自分のコードを修正する機会を与えました。 –

答えて

4

文字列を送信する前にWebClientにEncodingプロパティを設定してみてください。あなたはそれを指定していないので、私はそれがASCIIにデフォルトであると思う。 UploadString reference pageから引用します。

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

webClient.Encoding = Encoding.UTF8; 
関連する問題