C# C HttpResponse未写入CSV文件

C# C HttpResponse未写入CSV文件,c#,csv,httpresponse,C#,Csv,Httpresponse,我有一个表单,每当用户单击按钮时,它将返回一个csv文件。为了返回文件,我创建了一个名为sb的StringBuilder,并连接所有对sba的响应。要提到的是,我的字符串是阿拉伯语字符,所以我需要将它们编码为UTF8字符。然后,我尝试按如下方式返回我的csv文件: DataTable dt = auc.GetTradesByDate().Tables[0]; /**************************************************************/ Stri

我有一个表单,每当用户单击按钮时,它将返回一个csv文件。为了返回文件,我创建了一个名为sb的StringBuilder,并连接所有对sba的响应。要提到的是,我的字符串是阿拉伯语字符,所以我需要将它们编码为UTF8字符。然后,我尝试按如下方式返回我的csv文件:

DataTable dt = auc.GetTradesByDate().Tables[0];
/**************************************************************/
StringBuilder sb = new StringBuilder();
sb.Append("date, symbol, symbolName, buyerId,buyerName\n");
foreach (DataRow dr in dt.Rows)
{
    sb.Append(dr["date"]);
    sb.Append("," + dr["symbol"]);
    sb.Append("," + dr["symbolName"]);
    sb.Append("," + dr["buyerId"]);
    sb.Append("," + dr["buyerName"]);

    sb.Append("\n");
}

Response.Clear();
Response.ClearHeaders();
Response.ContentType = "text/csv";
Response.Charset = "";
Response.ContentEncoding = Encoding.UTF8;
Response.Buffer = true;

Response.AddHeader("content-disposition", string.Format("attachment;filename=trades_{0:yyyy-MM-dd}.csv", DateTime.Now));


byte[] BOM = new byte[] { 0xef, 0xbb, 0xbf };
Response.BinaryWrite(BOM);
Response.BinaryWrite(Encoding.UTF8.GetBytes(sb.ToString()));
Response.Flush();
Response.End();
sb已正确填充,但输出文件仍然为空。我将感谢你的帮助。有人能帮我吗


我已经使用了所有提出的方法,但仍然是空的。关键是,当我将字符串写入XML文件时,一切正常,但当涉及到CSV时,一切都不正常。那真让我发疯。我不知道有什么问题。我忘了写东西了吗?

如果有帮助的话,试着在下面两行写评论

Response.Charset = "";
Response.ContentEncoding = Encoding.UTF8;

为了解决这个问题,我做了很多努力。因为我已经花了很多时间在这个问题上,我会发布答案,也许它可以为其他人节省时间。 问题是我建造sb的方式。我必须建立它的CSV文件与添加格式。以下几点对我很有用:

DataTable dt = auc.GetTradesByDate().Tables[0];
/**************************************************************/
StringBuilder sb = new StringBuilder();

sb.AppendFormat("{0},{1},{2},{3},{4}"
                , "date", "symbol", "symbolName", "buyerId","buyerName\n");
foreach (DataRow dr in dt.Rows)
{
    sb.AppendFormat("{0},", dr["date"]);
    sb.AppendFormat("{0},", dr["symbol"]);
    sb.AppendFormat("{0},", dr["symbolName"]);
    sb.AppendFormat("{0},", dr["buyerId"]);
    sb.AppendFormat("{0}", dr["buyerName"]);
    sb.AppendFormat("\n");
}

string CsvHeader = "";
Response.Clear();
Response.ContentType = "text/csv";
Response.Buffer = true;
Response.AddHeader("content-disposition", string.Format("attachment;filename=trades_{0:yyyy-MM-dd}.csv", DateTime.Now));
Response.Write(CsvHeader + sb.ToString());
Response.End();

大约有一半的代码是不相关的,不管是这样还是那样——当它进入if体还是else体时,问题出在哪里?大概是if的身体,这意味着我们不需要看到其他的。始终尝试将代码减少到一个较低的级别。@JonSkeet对此表示抱歉。我已经编辑好代码了,那肯定更好。那么,客户端发生了什么?您是通过浏览器查看,还是通过编程方式下载?你有没有用Wireshark或Fiddler看过电线上的东西?您为什么要将字符集设置为空字符串而不是utf-8?客户端将从浏览器下载该文件。不,我没有检查连接。文件已成功下载,但只是空白。你认为代码没问题,网络层出了问题?如果这就是为什么它对XML文件没有任何问题?我怀疑网络有什么问题,但您需要知道响应中实际发生了什么。谢谢您的响应。我已经试过了,但是没有用。这不应该有任何区别——它当然不应该在获取内容和不获取任何内容之间产生区别。请不要这样安排日期。。。我认为你需要更深入地了解问题所在。您可能仍然希望使用AppendFormat,但每行只调用一次,但对这样的标题使用AppendFormat毫无意义。@JonSkeet我已经编辑了日期。我真的不知道有什么问题。一切看起来都很好,只是在添加了格式之后就开始工作了。你能告诉我更多吗?如果我的答案不好,你能给我一个更好的答案吗?基本上你需要自己做更多的诊断工作。首先,确保您仍然可以重现问题-如果返回到旧的构建器代码,您可以重现问题吗?如果是这样的话,那么您必须生成不同的字符串——因此您应该能够提供一个只生成这些字符串的最小示例,而根本不使用HttpResponse。例如,您可以将它们写入单独的文件并加以区分。