从ASP.NET中的泛型处理程序返回流

从ASP.NET中的泛型处理程序返回流,asp.net,vb.net,webforms,Asp.net,Vb.net,Webforms,因此,我想做的是添加一个指向网页的链接,当单击该链接时,将调用一个通用处理程序,该处理程序将在内存中创建所需的数据,并将其作为某种流返回给用户,然后提示用户将其保存为文件 因此,我们可能有: 点击 JavaSctipt makeme()函数只是 function makeme() { $.ajax({ url: 'makefile.ashx', cache: false }).done(function (response) { /

因此,我想做的是添加一个指向网页的链接,当单击该链接时,将调用一个通用处理程序,该处理程序将在内存中创建所需的数据,并将其作为某种流返回给用户,然后提示用户将其保存为文件

因此,我们可能有: 点击

JavaSctipt makeme()函数只是

 function makeme() {
    $.ajax({
        url: 'makefile.ashx',
        cache: false
    }).done(function (response) {
       //alert(repsonse)
    }); 
 }
在处理程序中,我尝试了:

  Dim rtn As String = "1,2,3,4,5"
  Dim bArray As Byte() = System.Text.Encoding.Default.GetBytes(rtn.ToCharArray())
  ' or Dim mstream As New MemoryStream(bArray)   ‘ alt (see below)
  ' either of the next two lines
  context.Response.ContentType = "application/octet-stream"
  context.Response.ContentType = "application/force-download"
  context.Response.AddHeader("Content-Length", bArray.Length.ToString())
  context.Response.AddHeader("Content-Disposition", "filename.csv")
  context.Response.BinaryWrite(bArray)
  ' or context.Response.Write(mstream)           ‘ if alt used above
但似乎什么也没发生

更简单的是:

  Dim rtn As String = "1,2,3,4,5"
  context.Response.Clear()
  context.Response.ContentType = "text/csv"
  context.Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv")
  context.Response.Write(rtn)

同样,单击链接时不会发生任何事情-我的意思是,调用了处理程序,但仅此而已。

问题在于jQuery的
$。ajax
方法从未打算触发文件下载。它的目的是下载数据,以便以后用JavaScript处理

您应该将锚点的
href
属性直接指向处理程序。然后浏览器将注意到响应的
内容配置
,并处理文件下载

<a href="makefile.ashx">Clickety</a>


有许多可能重复的问题显示如何返回CSV文件。这表明正确的内容类型是什么,下载是在内容处置头中指定的内容,而不是内容类型。除非您有一个Web表单应用程序,否则也没有理由创建处理程序。您想做什么?指出创建和发送CSV文件的正确方法要比修复此代码中的问题更容易,例如重复的内容类型标题、不正确的处理以及更糟糕的是,在使用服务器的代码页时缺少
字符集
标题(这肯定不是UTF8)要创建字节缓冲区,我看到的所有问题都会首先返回一个已创建并保存在服务器上的文件,我正试图避免这样做。是的,这是一个web表单应用程序。正如您所建议的,只需将JS调用中调用的URL直接输入地址栏即可!烦死我了——就是这么简单:只是把我的JS代码改成location.href='makefile.ashx';这就是诀窍。没有花哨的阿贾克斯。叹气再次感谢。