2013-02-26 2 views
1

Я пытаюсь удаленно загрузить CSV-файл, вызвав службу WCF с помощью jQuery. Поскольку файл на самом деле не находится на сервере, я пытаюсь вернуть его как поток. Поскольку я использую заголовок Content-Disposition, браузер клиента должен автоматически начать загрузку файла с заданным именем файла.Как загрузить файл из потока службы WCF?

Мой WCF метод сервиса в C#:

[OperationContract()] 
public Stream GetCsvFile(int id) 
{ 
    string s = ...; 
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/csv"; 
    WebOperationContext.Current.OutgoingResponse.Headers["Content-Disposition"] = "attachment; filename=\"file1.csv\""; 
    return GenerateStreamFromString(s); 
} 

public Stream GenerateStreamFromString(string s) 
{ 
    MemoryStream stream = new MemoryStream(); 
    StreamWriter writer = new StreamWriter(stream); 
    writer.Write(s); 
    writer.Flush(); 
    stream.Position = 0; 
    return stream; 
} 

Мой JQuery AJAX запрос:

$.ajax({ 
    type: "POST", 
    url: serviceUrl, 
    cache: false, 
    data: data, 
    dataType: "text", 
    contentType: "application/json; charset=utf-8", 
    success: function() { 
     // TODO... 
    } 
}); 

Этот запрос завершается успешно! И я могу видеть правильные данные CSV в ответе. Тем не менее, он не инициирует фактическое действие «загрузка файла» в браузере (сейчас тестирование на Chrome), а «file1.csv» не сохраняется на диске клиента.

В старой версии VB.NET одного и того же приложения, следующие работали в .aspx страницы с фоновым кодом:

Response.Clear() 
Response.ContentType = "text/csv" 
Response.AddHeader("content-disposition", "attachment; filename="file1.csv") 
Response.Write(s) 
Response.End() 

Это автоматически инициирует загрузку файла из «file1.csv». Ни один диалог «Сохранить как» не будет отображаться, файл будет сразу загружен. Это было круто.

Так как же это не работает, когда я пытаюсь вызвать службу WCF с помощью jQuery?

+2

ваш вызов ajax получит текстовый ответ. Он будет доступен только для JavaScript (он будет «разбираться» с помощью jQuery, он не сможет/не сможет его сохранить). См. [Этот пост здесь на SO] (http://stackoverflow.com/questions/365777/starting-file-download-with-javascript), чтобы узнать, как начать загрузку с JavaScript. –

+0

Это был дан ответ http://stackoverflow.com/questions/6668776/download-file-through-an-ajax-call-php –

ответ

0

Необходимо указать правильный ContentType на вашей стороне сервера