我有一个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对象。将FileInfo
与asAttachment
选项一起使用也无效;它刚刚返回了一堆文件信息。
目标是让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讨论了一个让我失望的问题。
答案 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也应该也适用于文本文件。