2011-02-02 18 views
1


私のC#プログラムはWebサービスを使用してサーバーと通信しますが、サーバーから大きなファイルをダウンロードしてダウンロードを続行するオプションがありますファイルのダウンロードを許可されている必要があります。Webサービス経由でファイルを転送するための最良の方法

私は

1は、ファイルをダウンロードするためにwgetのようないくつかのサードパーティのAPIを使用することで、それを行う方法上の2つの考えを持っていました。その問題は、私はAPIコマンドを習得する必要があること、そして私はプログラムでダウンロードの進捗状況を示すことができないということです。別の問題は、サーバからファイルを取得するために裸のURLを使用しなければならないことです。醜いと思われ、単にサーバーからダウンロードすることにつながる可能性があります(私は許可されることを望みますが、これは単なる学校プロジェクトなので実際の問題ではありません)。

私の他の考えは、ファイル内の位置とバイト数を取得し、それらを返すメソッドをWebサービス上に作成し、クライアントがそれらをまとめて作成することでした。ユーザーよりも複雑ですが、ファイルをダウンロードする権限を持っていなければなりません。私はテスターに​​いくつかの高度なプログラミングスキルを示すためにそれを使うことができます。それはパフォーマンス税になるかもしれないような問題です。
あなたの意見は?大きなファイルをサーバーからダウンロードするにはどうすればよいでしょうか?

+0

.NETのどのバージョンですか? WCFの機能は、ASMX Webサービスの機能と大きく異なります。 –

+0

ファイルがasmxファイルなので、私はそれがそれであると推測しています。 – Ziv

答えて

1

許可と部分ダウンロードの必要がない場合は、WebClient.DownloadDataまたはWebClient.DownloadDataAsyncがサーバーからファイルをダウンロードするのに適した方法です。

WebClientオブジェクトインスタンスのCredentialsを設定することによって、依然としてWebClientを承認のために使用できます。ユーザーがファイルのダウンロードを許可されていない場合、これらの資格情報に基づいて、サーバーは404(Not found)または403(Forbidden)を返すことができます。

サーバーがHTTP 1.1をサポートしている場合、クライアントはファイルの途中から開始できます。これを行うには、WebClientから継承し、GetWebRequestメソッドをオーバーライドするクラスを作成する必要があります。そのメソッドは、ヘッダーが位置GETを行うように設定します。

class MyWebClient : WebClient 
{ 
    public int StartDownloadAt { get; set; } 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address); 

     req.AddRange(position_to_start); 
    } 
} 

、それを使用するコードで:

MyWebClient client = new MyWebClient(); 
client.StartDownloadAt = 1024 * 2024; // start download 1 megabyte into file. 
client.DownloadData(...); 

上記の一例に過ぎません。ダウンロードが完了(または中止)されたときにStartDownLoadAtプロパティを0にリセットし、StartdownloadAtが0に設定されている場合はAddRangeを実行しないことで、より堅牢にしたいと思うでしょう。範囲を完全にサポートするには、

もちろん、クライアントは、ダウンロードが完了した後にダウンロードした異種のパーツを一緒にステッチングする必要があります。

少しの作業で、WebClientクラスを使用することが可能であることが重要です。

関連する問題