2012-02-01 14 views
0

基本認証を使用するREST WebサービスでXML文字列を返します。 XMLをRestサービスに送信する際に問題が発生する

 var req = (HttpWebRequest)WebRequest.Create(uri); 
     String readToEnd; 
     const string postData = ""; 
     var encoding = new ASCIIEncoding(); 
     byte[] byte1 = encoding.GetBytes(postData); 

     req.Method = "POST"; 
     req.Timeout = 10000; 
     req.ContentType = "text/XML"; 
     req.ContentLength = byte1.Length; 

     string authInfo = userName + ":" + password; 

     authInfo = Convert.ToBase64String(Encoding.UTF8.GetBytes(authInfo)); 
     req.Headers["Authorization"] = "Basic " + authInfo; 

     var newStream = req.GetRequestStream(); 
     newStream.Write(byte1, 0, byte1.Length); 
     newStream.Close(); 

     try 
     { 
      var resp = req.GetResponse(); 
      var answer = resp.GetResponseStream(); 
      var _answer = new StreamReader(answer); 
      readToEnd = _answer.ReadToEnd(); 
      answer.Close(); 
     } 
     catch (Exception ex) 
     { 
      readToEnd = null; 
     } 

     return readToEnd != null ? XDocument.Parse(readToEnd) : null; 

今すぐ後に、私はそのXMLを操作していると私は戻って別のURIにそれを投稿する準備ができています:ここで私は、データを取得するために使用してXDocumentとしてそれを返す方法があります。私はおそらく、新しいXML文字列を変数 'postData'に入れることを除いて、同じコードになると思います。

xml文字列をWebサービスに投稿する正しい方法ですか?私は見てきましたが、基本的な認可が使用されているときは、このことについて何も言わないようです。

+0

質問の署名についてのよくある質問をご覧ください。 –

+0

あなたは実際に発生した問題を述べることに失敗しました。詳しく教えてください。 –

+0

宜しければ、私は両方の問題に対処しました。 – Jason

答えて

1

私は以下を行います。キーは、投稿する前にデータをリクエストストリームに書き込む必要があることです。それが役に立てば幸い。

var request = CreateBaseRequest(body); 
     HttpWebResponse WebResp = (HttpWebResponse)request.GetResponse(); 
     Stream Answer = WebResp.GetResponseStream(); 
     StreamReader response = new StreamReader(Answer); 
     var r = response.ReadToEnd(); 

static HttpWebRequest CreateBaseRequest(string postData) 
    { 

     var req = (HttpWebRequest)HttpWebRequest.Create(@"https://xyz.com/"); 

     req.ContentType = "application/x-www-form-urlencoded; charset=UTF-8"; 
     req.Method = "POST"; 
     req.KeepAlive = true; 

     byte[] buffer = Encoding.ASCII.GetBytes(postData); 

     req.ContentLength = buffer.Length; 
     Stream PostData = req.GetRequestStream(); 
     PostData.Write(buffer, 0, buffer.Length); 
     PostData.Close(); 

     return req; 

    } 
+0

残念ながら、私はこれで運がないです。私はxmlをbody変数に入れてこのコードを実行し、var rはちょうど私を返す ""。私はサービスがリクエストのヘッダーにユーザー名/パスワードを受け入れるので、サービス参照を追加できません。だから私はその部分を書いていないので、サーバー側で何が起こっているのか分からない。しかしそうでなければ、あなたのコードは仕事をするかもしれないように見えます。 – Jason

+0

ContentTypeを "text/XML"に変更したとします。私の例はjsonです。しかしそれは問題ではないかもしれません。 rには何が含まれると思いますか?それはあなたの投稿への返信なので、おそらく投稿は機能していますが、何も返されません。私が提案できるもう一つのことは、これをフィドラーで監視することです。あなたの最初のステップは、フォームが形成されていることを確認するためのリクエストを検査し、レスポンスを調べて何かがあるかどうかを調べ、httpステータスコードをチェックすることです。 http://fiddler2.com/fiddler2/ – user381624

関連する問題