Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ServiceStack下载文件(html内容)_C#_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,servicestack" /> servicestack,C#,servicestack" />

C# 使用ServiceStack下载文件(html内容)

C# 使用ServiceStack下载文件(html内容),c#,servicestack,C#,servicestack,我使用的是一个简单的web应用程序 在此应用程序中,我需要将一些内容“导出”到Excel。。这就是我采取的方法: 我使用jQuery获取一个表的HTML内容a获取HTML内容 一个表的,并发送到服务 服务将内容写入文件(使用一些CSS) 使用相同的服务,但使用GET方法,我读取文件并 使用ContentType:“application/vnd.ms excel”下载 我以前在没有服务堆栈的情况下使用过这种方法,而且效果很好。。XLS文件具有正确的内容和一些颜色 现在,当我使用get方法获取文件

我使用的是一个简单的web应用程序

在此应用程序中,我需要将一些内容“导出”到Excel。。这就是我采取的方法:

  • 我使用jQuery获取一个表的HTML内容a获取HTML内容 一个表的,并发送到服务
  • 服务将内容写入文件(使用一些CSS)
  • 使用相同的服务,但使用
    GET
    方法,我读取文件并 使用
    ContentType:“application/vnd.ms excel”下载
  • 我以前在没有服务堆栈的情况下使用过这种方法,而且效果很好。。
    XLS
    文件具有正确的内容和一些颜色

    现在,当我使用
    get
    方法获取文件时(即,使用浏览器访问url),文件内容不好

    ServiceStack让我们下载一些格式:html、csv、jsv、json、xml

    html格式显示了一个默认的报告页面,唯一有效的格式是jsv

    我的问题是:如何下载像纯html文件这样的文件

    一些代码:

    public class ExcelService : RestServiceBase<Excel>
    {   
        public override object OnGet (Excel request)
        {
            string file = request.nombre;
            //Response.Clear();
            HttpResult res = new HttpResult();
            res.Headers[HttpHeaders.ContentType] = "application/vnd.ms-excel";
            res.Headers[HttpHeaders.ContentDisposition] = "attachment; filename="+file+".xls";
            string archivo = System.IO.File.ReadAllText("tmp/"+file+".html");
            res.Response = archivo;
            return res;
        }
    }
    
    公共类ExcelService:RestServiceBase
    {   
    公共覆盖对象OnGet(Excel请求)
    {
    字符串文件=request.nombre;
    //Response.Clear();
    HttpResult res=新的HttpResult();
    res.Headers[HttpHeaders.ContentType]=“应用程序/vnd.ms excel”;
    res.Headers[HttpHeaders.ContentDisposition]=“附件;文件名=“+file+”.xls”;
    字符串archivo=System.IO.File.ReadAllText(“tmp/”+File+”.html”);
    res.Response=archivo;
    返回res;
    }
    }
    

    提前感谢中的HttpResult构造函数作为支持文件下载的重载,例如:

    return new HttpResult(new FileInfo("tmp/"+file+".html"), 
        asAttachment: true, 
        contentType: "application/vnd.ms-excel");
    
    这将设置文件下载所需的
    ContentDisposition
    HTTP头

    创建自己的Http结果 为了更细粒度地控制HttpOutput,您还可以创建自己的结果类。以下是从以下站点下载Excel电子表格的示例:

    public类ExcelFileResult:ihaoptions,IStreamWriterAsync
    {
    私有只读流_responseStream;
    公共IDictionary选项{get;private set;}
    public ExcelFileResult(流响应流)
    {
    _responseStream=responseStream;
    选项=新字典{
    {“内容类型”、“应用程序/八位字节流”},
    {“内容处置”,“附件;文件名=\“report.xls\”;“}
    };
    }
    公共异步任务WriteToAsync(流响应Stream,CancellationToken token=default)
    {
    如果(_responseStream==null)
    返回;
    wait_responseStream.CopyToAsync(responseStream,token);
    等待响应Stream.FlushAsync(令牌);
    }
    }
    
    很好的例子,对我来说很有用。值得注意的是,上面的这个类是服务操作返回的响应类。您应该如何使用IStreamWriterAsync更新这个答案?@mythz谢谢。在web环境(.NET Framework 4.6)中,我必须将“CopyToAsync”替换为“WriteToAsync”。否则,内容是一个0长度的文件(即使使用“CopyToAsync”进行单元测试会返回一个具有预期长度的流)。@labilbe奇怪,也许你的
    \u responseStream
    位置没有设置为
    0
    ?@mythz kudos!!这就是原因。我印象深刻!
    public class ExcelFileResult : IHasOptions, IStreamWriterAsync
    {
        private readonly Stream _responseStream;
        public IDictionary<string, string> Options { get; private set; }
    
        public ExcelFileResult(Stream responseStream)
        {
            _responseStream = responseStream;
    
            Options = new Dictionary<string, string> {
                 {"Content-Type", "application/octet-stream"},
                 {"Content-Disposition", ""attachment; filename=\"report.xls\";"}
             };
        }
    
        public async Task WriteToAsync(Stream responseStream, CancellationToken token = default)
        {
            if (_responseStream == null) 
                return;
    
            await _responseStream.CopyToAsync(responseStream, token);
            await responseStream.FlushAsync(token);
        }
    }