2016-08-08 20 views
0

コンパクトなフレームワークからREST経由でサーバーにファイルを転送する最良の方法を探しています。私は.net Web APIを使って作成したWebサービスを持っています。私はいくつかのSOの質問やファイルの送信を扱う他のサイトを見てきましたが、私が必要とするもののどれもうまく動作していないようです。Compact Framework - REST経由でファイルをアップロード

私は、WM 6および6.5デバイスからRESTサービスにメディアファイルを送信しようとしています。ほとんどのファイルは300k未満ですが、奇数のファイルは2〜10メガバイト程度です。誰かがこの仕事をするために使用できるいくつかのスニペットを持っていますか?

ありがとうございます!

+0

他の質問/サイトの提案でうまくいかなかったものを指定できますか?それ以外の場合は、ここの回答があなたのために働かない可能性があります。 –

+0

確かに - XMLファイルやテキストファイルをどこに送信しているのかわかりました。あるいは、データ構造をファイルにシリアライズする(protobufのような)ものもあります。また、マルチパートプロトコルを使用する場所もいくつか見てきましたが、コンパクトなフレームワークはそれをサポートしていません。 – Kyver

+0

ほとんどの例は 'multipart/form-data'を含んでいます。自分で作成することはできますが、実際にファイルを送信する必要はありません。私は例を投稿します。 –

答えて

1

は、私は、これは、ファイルを送信するための最小値であると思う:

using (var fileStream = File.Open(@"\file.txt", FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://www.destination.com/path"); 
    request.Method = "POST"; // or PUT, depending on what the server expects 
    request.ContentLength = fileStream.Length; // see the note below 
    using (var requestStream = request.GetRequestStream()) 
    { 
     int bytes; 
     byte[] buffer = new byte[1024]; // any reasonable buffer size will do 
     while ((bytes = fileStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      requestStream.Write(buffer, 0, bytes); 
     } 
    } 

    try 
    { 
     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     { 

     } 
    } 
    catch (WebException ex) 
    { 
     // failure 
    } 
} 

注:HTTPは、あなたがデータを送信して「完了」しているときに知っておく方法が必要です。

  • 例で使用されるように、我々が設定して何も
  • request.SendChunkedを送信する前に、ファイルのサイズを知っているので、request.ContentLengthを設定し、個々のサイズ
  • を含むデータのチャンクを送信するためにこれを達成するための3つの方法があります。
  • でもメモリバッファに書き込むようにrequest.AllowWriteStreamBufferingを設定していますが、コンパクトなフレームワークでその分のメモリを無駄にすることはお勧めしません。
+0

私はこれを試して、いくつかの問題に遭遇しました。第1に、CF要求ストリームはchar配列のみを許可します。私はrequestStream.BaseStream.Writeをうまく使用することができました。しかし、私は私のRESTアプリケーション( "リモートサーバーがエラーを返しました:(500)内部サーバーエラー")から内部サーバーエラーを取得しているので、これがエラーを引き起こしたかどうかはわかりません。私は郵便配達員を使ってテストデータを送ることができますが、それは素晴らしいですが、私のCFアプリケーションはサーバーにそのエラーを返すようにします。これにより、CF側で何かが間違っていると思うようになります。 – Kyver

+0

CF上のchar配列のみを許可する制限はありません(少なくとも2.0と3.5ではなく)。私は問題はあなたのサービスがJSONやXMLのような特定の_format_でデータが送られることを期待していると思います。そのような場合はバイナリデータをエンコードする必要があります(つまりBase64を使用する必要があります)。 –

+0

優秀、それはすべて今働いている。私は、RequestStreamにStreamWriterオブジェクトを使用しました。これは、readステートメントのバイト配列を受け入れません(また、遅延バインディングをサポートしないため、CFでオブジェクトを使用することはできません)。私はStreamオブジェクトに切り替えました。問題はありません。サーバーのエラーについては、郵便配達員でテストしている間にローカルマシンで作業していました。デプロイメントの問題が原因でライブで動作しませんでした。ありがとう! – Kyver

関連する問題