将.txt文件发送到客户端c#

将.txt文件发送到客户端c#,c#,httpresponse,C#,Httpresponse,我正在努力从服务器获取文件并允许用户下载。在我的机器上,我刚刚打开它,但由于它已经投入生产,这似乎不是一个有效的解决方案 public HttpResponseMessage Post([FromBody]string[] info) { HttpResponseMessage resp = new HttpResponseMessage(); string html = info[0]; _file += info[2] + @"\media\"; try

我正在努力从服务器获取文件并允许用户下载。在我的机器上,我刚刚打开它,但由于它已经投入生产,这似乎不是一个有效的解决方案

public HttpResponseMessage Post([FromBody]string[] info)
{
    HttpResponseMessage resp = new HttpResponseMessage();
    string html = info[0];
    _file += info[2] + @"\media\";

    try
    {                
        using (StreamWriter sw = File.CreateText(_file))
        {
            for (int n = 0; n <= str.Length; n = n + 2)
            {.WriteLine(str[n]);
            }
        }
        do
        {
            string notepadPath = Environment.SystemDirectory + "\\notepad.exe";

            var startInfo = new ProcessStartInfo(notepadPath)
            {
                WindowStyle = ProcessWindowStyle.Maximized,
                Arguments = _file
            };

            Process.Start(startInfo);
            break;
        } while (true);
    }
    catch (Exception ex)
    {
        //handled
    }

    return resp;
}
公共httpresponsemessagepost([FromBody]字符串[]信息)
{
HttpResponseMessage resp=新的HttpResponseMessage();
字符串html=info[0];
_文件+=信息[2]+@“\media\”;
尝试
{                
使用(StreamWriter sw=File.CreateText(_文件))
{

对于生产环境中的(int n=0;n),您将无法在web服务器上启动NotePad.exe进程,并且希望任何人都能够访问它


web服务器唯一能做的就是在HTTP响应中使用
内容处置:附件;filename=something.txt
发出文件,并希望客户端将NotePad.exe映射到正确的内容类型/扩展名。

这对我使用MVC 5很有效。希望它也对你有效!:)请记住,客户端计算机将需要自行决定如何处理该文件-您确实无法控制在这样的客户端计算机上启动进程。在这条路径上存在完全的HTTP无政府状态

如果您正在动态创建文本文件,只需使用System.text.Encoding.UTF8.GetBytes(yourStringHere)就可以了,而无需实际创建文件-为自己保存一些磁盘IO和所有这些

    public void DownloadTest()
    {
        var filePath = @"c:\code\testFile.txt";
        var reader = new StreamReader(filePath);
        var data = reader.ReadToEnd();
        var dataBinary = System.Text.Encoding.UTF8.GetBytes(data);

        Response.ContentType = "text/plain";
        Response.AddHeader("content-disposition", "attachment; filename=data.txt");

        Response.BinaryWrite(dataBinary);
    }

根据您的意见,应采取以下措施:

public HttpResponseMessage Post([FromBody]string[] info)
{
    // create your file on the fly.
    var txtBuilder = new StringBuilder();
    for(int n = 0; n <= str.Length; n = n + 2)
    {
        txtBuilder.AppendLine(str[n]);
    }

    // make it as a stream
    var txtContent = txtBuilder.ToString();
    var txtStream = new MemoryStream(Encoding.UTF8.GetBytes(txtContent));

    // create the response and returns it
    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    result.Content = new StreamContent(txtStream);
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = info[0] // Not sure about that part. You can change to "text.txt" to try
    };

    return result;
}
公共httpresponsemessagepost([FromBody]字符串[]信息)
{
//动态创建您的文件。
var txtBuilder=新的StringBuilder();

对于(int n=0;n您是在动态创建文件吗?@StfBln是的,我是这么说的,您是说我应该创建一个void方法,并将文件路径传递给它,然后使用此代码?您能解释一下“Response”从何而来吗?我使用了void方法,因为当您执行Response.BinaryWrite(…)实际上,您没有返回任何内容。如果控制器中存在此方法,则响应对象是内置于MVC中的。我认为大多数ASP.NET版本都有某种类型的响应对象,您可以访问。哦,至于文件路径,您当然可以这样做,但如果您正在动态生成问题中提到的文本文件,则ts,您可以消除前3个变量(filePath、reader、data),只需执行
var-dataBinary=System.Text.Encoding.UTF8.GetBytes(whateverStringYouGenerated);
您可以解释或给出一个示例说明我如何做到这一点吗?请参阅。