2011-01-24 13 views
3

私は応答のように見えるファイル方法でASMX(なしWCF)Webサービスを持っている:ASMXファイルのダウンロード

[WebMethod] 
public void GetFile(string filename) 
{ 
    var response = Context.Response; 
    response.ContentType = "application/octet-stream"; 
    response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName); 
    using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/"), fileName), FileMode.Open)) 
    { 
     Byte[] buffer = new Byte[256]; 
     Int32 readed = 0; 

     while ((readed = fs.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      response.OutputStream.Write(buffer, 0, readed); 
      response.Flush(); 
     } 
    } 
} 

を、私は私のコンソールアプリケーションでWeb参照を使用してローカルファイルシステムにこのファイルをダウンロードしたいです。ファイルストリームを取得する方法

P.S.私は(HttpWebRequestクラスを使用して)投稿要求を介してファイルをダウンロードしようとしましたが、はるかに洗練されたソリューションがあると思います。

答えて

8

Webサービスのweb.configでHTTPを有効にすることができます。その後

<webServices> 
     <protocols> 
      <add name="HttpGet"/> 
     </protocols> 
    </webServices> 

あなただけのファイルをダウンロードするには、Webクライアントを使用することができるはずです(テキストファイルでテスト):

string fileName = "bar.txt" 
string url = "http://localhost/Foo.asmx/GetFile?filename="+fileName; 
using(WebClient wc = new WebClient()) 
wc.DownloadFile(url, @"C:\bar.txt"); 

編集:

設定や取得CookieをサポートするにはGetWebRequest()をオーバーライドするカスタムWebClientクラスを作成する必要があります。これは簡単で、数行のコードだけを書く必要があります。

public class CookieMonsterWebClient : WebClient 
{ 
    public CookieContainer Cookies { get; set; } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); 
     request.CookieContainer = Cookies; 
     return request; 
    } 
} 

は、あなたはどうしたらこのカスタムWebクライアントを使用するには、次の答えを

myCookieContainer = ... // your cookies 

using(CookieMonsterWebClient wc = new CookieMonsterWebClient()) 
{ 
    wc.Cookies = myCookieContainer; //yum yum 
    wc.DownloadFile(url, @"C:\bar.txt"); 
} 
+0

感謝を! CookieContainerプロパティなどのWebClientインスタンスにCookieを提供する方法はありますか?私は認証のためにクッキーを使用します。 – 2xMax

関連する問題