c# - 如何从 WCF 服务流下载文件?

标签 c# jquery .net ajax wcf

我正在尝试通过使用 jQuery 调用 WCF 服务来远程下载 CSV 文件。由于该文件实际上并不驻留在服务器上,因此我一直在尝试将其作为流返回。由于我使用了 Content-Disposition header ,客户端的浏览器应该会自动开始下载具有给定文件名的文件。

我在 C# 中的 WCF 服务方法:

[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”的文件下载。甚至不会显示“另存为”对话框,文件会立即下载。非常酷。

那么,当我尝试使用 jQuery 调用 WCF 服务时,为什么它不起作用?

最佳答案

您需要在服务器端指定适当的 ContentType

关于c# - 如何从 WCF 服务流下载文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15092984/

相关文章:

C# Lambda 构建器模式

c# - 当它返回 IHttpActionResult 时,我如何对 web api 操作方法进行单元测试?

c# - 如何为给定服务注入(inject)所有实现?

c# - 将 Html 文档(包含图像)作为电子邮件附件发送 C#

javascript - jQuery/CSS : How to add page breaks dynamically

.net - 捕获 dll 加载

javascript - 无法让 JQuery 自动计算与 PHP 一起使用

jquery - google搜索在分页时使用哪种jquery效果?

c# - 在 Entity Framework 中重复创建和删除数据库

c# - 为什么在 WCF 中使用 LocalChannel 时执行序列化?