0

我有这样的 WCF 合同:

[OperationContract]
[WebInvoke(Method = "POST")]
string Import_CSV();

然后 Import_CSV() 方法成功地接受来自 HttpContext.Current.Request.Files 的文件上传... Import_CSV() 方法返回一个字符串,其中包含成功消息或发生的特定错误。

但是,如果我对上传的文件执行的服务器操作出现多个错误,那么我的目标是生成一个 csv 文件并将其提供给用户以供他们下载。

所以,我创建了 csv 内容,现在我想显示它供用户下载。

将 Statuscode 设置为 (int)HttpStatusCode.OK,然后我返回一个空字符串表示成功,并使用 response.write 来提供新生成的 csv 文件,如下所示:

HttpContext.current.Response.ContentType = "text/csv";
HttpContext.current.Response.AddHeader("Content-Disposition", "attachment;filename=ImportErrors.csv");
HttpContext.current.Response.AddHeader("Pragma", "no-cache");
HttpContext.current.Response.AddHeader("Cache-Control", "no-cache");
foreach (var line in csvLines)
{
    context.Response.Write(line);
    context.Response.Write(Environment.NewLine);
    context.Response.Flush();
}
context.ApplicationInstance.CompleteRequest();

在 Internet Explorer 中,一切似乎都按计划进行,但 Firefox 和 Chrome 似乎不知道如何处理这些数据。我尝试为内容设置不同的 http 状态代码和不同的 mime 类型,但我怀疑我走错了路。

有什么建议么?

我最近在堆栈溢出问题上问了这个难题的一小部分:response.write 上的 88 字节限制?

答案非常有帮助,但现在我的问题是关于 WCF,通过此服务调用返回文本和文件,并且需要在 IE 之外工作。谢谢!


在 chrome 中使用时的标题:

要求:

POST /services/PTService.svc/Import_CSV HTTP/1.1
Host: inf18
Connection: keep-alive
Content-Length: 565
Origin: http://inf18
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 
Safari/537.11
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykpa0b9lHil712wdL
Accept: */*
Referer: http://inf18/dashboard/ManageRecipient.aspx
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: ASP.NET_SessionId=o50tom0nkjfmglumcmrbtlds

回复:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/csv; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Content-Disposition: attachment;filename=ImportErrors.csv
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 18 Dec 2012 18:30:37 GMT

在 IE 中使用的标头:(IE9 兼容视图,IE9 标准)

要求:

POST /services/PTService.svc/Import_CSV HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-
ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://inf18/dashboard/ManageRecipient.aspx
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR
2.0.50727;     .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; MDDR)
Content-Type: multipart/form-data; boundary=---------------------------7dc180222c0fb0
Accept-Encoding: gzip, deflate
Host: inf18
Content-Length: 598
Connection: Keep-Alive
Pragma: no-cache
Cookie: ASP.NET_SessionId=e2iwodwyy2muxoj4zhpisl5k

回复:

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Transfer-Encoding: chunked
Content-Type: text/csv; charset=utf-8
Content-Encoding: gzip
Vary: Accept-Encoding
Server: Microsoft-IIS/7.5
Content-Disposition: attachment;filename=ImportErrors.csv
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 18 Dec 2012 18:33:34 GMT
4

1 回答 1

1

您是否尝试在写入响应之前添加以下行?

/******************************************/
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.Clear();
/******************************************/

HttpContext.Current.Response.ContentType = "text/csv";
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=ImportErrors.csv");
//rest of your code sample
于 2012-12-18T16:49:10.310 回答