我应该如何使用ServiceStack返回一个大文本文件?

时间:2015-01-15 06:36:04

标签: c# asp.net servicestack

我有一个Web服务需要为客户端上的AJAX调用返回一个大文本文件。首先,我有一个文本文件的有效路径:

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讨论了一个让我失望的问题。

1 个答案:

答案 0 :(得分: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选项进行测试:

您也可以直接访问文本文件(即没有服务):

此外,different ways to return an Image response也应该也适用于文本文件。