2015-01-15 33 views
1

我有一個Web服務,需要返回一個大的文本文件在客戶端上的AJAX調用。首先,我要對文本文件的有效路徑:如何使用ServiceStack返回大型文本文件?

var fileName = <file on server> 

我知道文件名是有效的,因爲我可以將服務器作爲FileStream上打開它。

我已經嘗試了ServiceStack and returning a stream中推薦的一些不同方法,但似乎無法使其工作。

我應該返回什麼?我最好的猜測是:

var stream = File.Open(fileName, ...); 
return HttpResult(stream, "text/plain"){ AllowPartialResponse = false }; 

但這並不奏效;該響應是一個簡單的JSON對象。使用FileInfoasAttachment選項也不起作用;它只是返回了一堆文件信息。

的目標是JavaScript客戶端能夠接收內容爲一個字符串:

api.getFile({...}).then(function (result) { 
    // result has the file contents 
}); 

什麼是做這種正確的方法是什麼?

更新

最後我用這個數據流方式得到它的工作:

using(var fs = File.OpenRead(fileName)) 
{ 
    fs.CopyTo(Response.OutputStream); 
} 

我不完全理解爲什麼一些其他方法沒有工作,但他們似乎與1)FileInfo及其在服務器上的行爲方式有關,2)我的開發環境中的文件權限,以及3)「部分內容」問題和異常。 File.Exists() returns false, but not in debug討論了一個拋出我的問題之一。

回答

4

我剛剛committed a Service that returns a text file並如期HttpResult API的工作:

[Route("/textfile-test")] 
public class TextFileTest 
{ 
    public bool AsAttachment { get; set; } 
} 

public class MyServices : Service 
{ 
    public object Any(TextFileTest request) 
    { 
     return new HttpResult(new FileInfo("~/textfile.txt".MapHostAbsolutePath()), 
      asAttachment:request.AsAttachment); 
    } 
} 

,你可以帶或不帶asAttachment選項測試出:

Y您也可以直接訪問文本文件(即無Service):

此外,different ways to return an Image response也應適用於文本的文件。

+0

感謝您的快速回復。無論文件的大小如何,這裏是我得到的錯誤:https://gist.github.com/sethlivingston/fc7236c59d4f11a4124e。有任何想法嗎? – Seth

+0

@Seth你能直接通過url訪問文件嗎?我可以讓你更新你的問題,以包括返回這個錯誤的原始HTTP請求和響應頭?您可以通過Chrome的WebInspector或Fiddler獲取此信息。 – mythz

+0

更新了要點:https://gist.github.com/sethlivingston/fc7236c59d4f11a4124e。讓我知道你是否需要更多。 – Seth

相關問題