ASMX скачать файл - PullRequest
       9

ASMX скачать файл

3 голосов
/ 25 января 2011

У меня есть веб-служба ASMX (без WCF) с методом, который отвечает на файл, который выглядит следующим образом:

[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();
        }
    }
}

, и я хочу загрузить этот файл в локальную файловую систему, используя веб-ссылку в моем консольном приложении.Как получить файловый поток?

PS Я пытался загрузить файлы с помощью пост-запроса (используя класс HttpWebRequest), но я думаю, что есть гораздо более элегантное решение.

1 Ответ

8 голосов
/ 25 января 2011

Вы можете включить HTTP в web.config вашего веб-сервиса.

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

Тогда вы сможете использовать веб-клиент для загрузки файла (проверено с помощью текстового файла):

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 вам необходимо написать собственный класс WebClient, который переопределяет GetWebRequest(), это легко сделать и всего несколько строк кода:

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;
    }
}

Чтобы использовать этот пользовательский веб-клиент, вы должны:

myCookieContainer = ... // your cookies

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