Ok, sprawdziłem w starej aplikacji miałem i oto próbka. Musisz się dostosować, ale pomysł jest tutaj. Ta pierwsza część jest częścią atrybutu przechwytywacza żądań, który jest umieszczony na WebMethod
. Cały przechwytujący jest dość złożony, ponieważ zarządza kilkoma przypadkami.
int byteSize = 262144;
byte[] data = new byte[byteSize];
if (!String.IsNullOrEmpty(myfileName))
{
_context.Response.AddHeader("Content-disposition", "attachment; filename=\"" + myfileName+ "\"");
}
_context.Response.ContentType = DefaultContentType;
_context.Response.Cache.SetCacheability(HttpCacheability.Private);
_context.Response.Cache.SetExpires(DateTime.UtcNow.AddHours(1));
_context.Response.Buffer = false;
_context.Response.BufferOutput = false;
_context.Response.AddHeader("Content-length", myStreamSize.ToString());
try
{
int counter = 0;
int bytesRead = mystream.Read(data, 0, byteSize);
while ((long)counter < myStreamSize|| bytesRead > 0)
{
counter += bytesRead;
if (bytesRead < byteSize)
{
byte[] outBuf = new byte[bytesRead];
Array.Copy(data, outBuf, bytesRead);
_context.Response.BinaryWrite(outBuf);
}
else
{
_context.Response.BinaryWrite(data);
}
bytesRead = mystream.Read(data, 0, byteSize);
}
}
finally
{
mystream.Close();
mystream.Dispose();
}
_context.Response.End();
To jest druga część w JavaScript po stronie klienta. Użyliśmy ExtJS zamiast jQuery.
downloadFile: function(url, getArgs) {
if(!this.iframe)
{
this.iframe = document.createElement("iframe");
this.iframe.className = "x-hidden";
document.body.appendChild(this.iframe);
}
var args = Ext.urlEncode(getArgs);
url = url + (args ? ("?" + args) : "");
this.iframe.src = url;
}
Kliknięcie przycisku wywoływałoby tę funkcję i podawało jej adres WebMethod, a ostatecznie dodatkowe argumenty do przekazania. Ideą strony JS jest utworzenie ukrytej ramki iFrame, która pobierze adres URL, a następnie wyświetli monit o pobranie.
Mam nadzieję, że pomaga się
Jakiego rodzaju informacje dodajesz do nagłówka żądania? Odnosząc się do odpowiedzi, po prostu odeślij to, czego chcesz, używając czegoś w stylu 'Response.Clear(); Response.ContentType = "application/text"; Response.ContentEncoding = _ex.Encoding; Response.AddHeader ("content-disposition", String.Format ("attachment; filename = {0}", _ex.FileName)); Response.BinaryWrite (_ex.Output); Response.End(); ' –
[This] (http://stackoverflow.com/questions/24501358/how-to-set-a-header-for-a-http-get-request-and-trigger-file -download/24523253 # 24523253) nie jest dokładnie duplikatem pytania, ale jest przeznaczone specjalnie dla żądań GET, ale odpowiedzi tam mogą być przydatne. –