2011-04-13 14 views
0

以下のコードを使用して、サイトにバイト配列を送信しています。なぜこのコードは、インターネットに接続されていない場合でも例外をスローしていないのですか?接続がない場合でもストリームを取得してit.Iに書き込むことができますが、例外をスローすることを期待しますStream postStream = request1.EndGetRequestStream(result)。なぜそのような行動をするのか。インターネット接続がなくてもHttpWebRequestがストリームを取得しています

 private void UploadHttpFile() 
    { 
     HttpWebRequest request = WebRequest.CreateHttp(new Uri(myUrl)); 
     request.ContentType = string.Format("multipart/form-data; boundary={0}", boundary); 


     request.UserAgent = "Mozilla/4.0 (Windows; U; Windows Vista;)"; 

     request.Method = "POST"; 
     request.UseDefaultCredentials = true; 

     request.BeginGetRequestStream(GetStream, request); 


    } 

    private void GetStream(IAsyncResult result) 
    { 
     try 
     { 
      HttpWebRequest request1 = (HttpWebRequest)result.AsyncState; 
      using (Stream postStream = request1.EndGetRequestStream(result)) 
      { 
       int len = postBody.Length; 
       len += mainBody.Length; 
       len += endBody.Length; 
       byte[] postArray = new byte[len + 1]; 
       Encoding.UTF8.GetBytes(postBody.ToString()).CopyTo(postArray, 0); 
       Encoding.UTF8.GetBytes(mainBody).CopyTo(postArray, postBody.Length); 
       Encoding.UTF8.GetBytes(endBody).CopyTo(postArray, postBody.Length + mainBody.Length); 
       postStream.Write(postArray, 0, postArray.Length); 
      } 
     } 

答えて

2

書き込みが完了するまではすべてをバッファリングしています。その時点で、コンテンツの長さをすぐに使用できるようになります。

request.AllowWriteStreamBuffering = false; 

これは、少なくともストリームに書き込むと失敗すると思われます。

ところで、postArrayのための必要な長さのあなたの計算が...常にそうではありません文字あたり1つのバイトを、想定しているように見えるとあなたはそれが冗長だように見えるpostBodyToStringを呼んでいます。

:ちょうど StreamWriterを使用

byte[] postBodyBytes = Encoding.UTF8.GetBytes(postBody); 
postStream.Write(postBodyBytes, 0, postBodyBytes.Length); 
// etc 

か(できれ):私はあなたが... はどちらかあなたは3回を書く呼び出すことができ、いずれにせよ、単一のコールに書き込もうとしている理由はわかりません

postArrayを初期化するときに必要な長さに1を追加した理由が不明です。 は、データの最後に余分な "0"バイトを送信しようとしていますか?

+0

WP7では 'AllowWriteStreamBuffering'は利用できません。' AllowReadStreamBuffering'しか見ることができません。 – Vaysage

+0

@Vaysage:ああ...その場合は、あなたが応答を得るまであなたがよく知ることができないかもしれません。あなたが書いているコードで実際に多くのことをやっているわけではないことを考えると、それは特別な苦難ですか? –

+0

はい最後にゼロを送信する必要があります。投稿したメソッドはこれを行う最も良い方法です。このメソッドのみを使用します。 – Vaysage

関連する問題