加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 无法通过IHttpAsyncHandler发送文件

发布时间:2020-12-16 01:32:52 所属栏目:百科 来源:网络整理
导读:我正在使用IHttpHandler调用web服务并将生成的byte []作为下载的文件附件返回给客户端.这很好,但是当我尝试将IHttpHandler更改为IHttpAsyncHandler时,文件下载对话框显示,但文件没有开始/完成下载.我究竟做错了什么? %@ WebHandler Language="C#" Class="Pr
我正在使用IHttpHandler调用web服务并将生成的byte []作为下载的文件附件返回给客户端.这很好,但是当我尝试将IHttpHandler更改为IHttpAsyncHandler时,文件下载对话框显示,但文件没有开始/完成下载.我究竟做错了什么?

<%@ WebHandler Language="C#" Class="PreviewPDF"  %>

using System;
using System.Web;

public class PreviewPDF : IHttpAsyncHandler
{
    public void ProcessRequest(HttpContext context)
    {
    } 

    public IAsyncResult BeginProcessRequest(HttpContext context,AsyncCallback cb,Object extraData)
    {
        string data = "some data";

        using (WebService.RequestService service = new WebService.RequestService())
        {
            AsyncCallback callback = new AsyncCallback(EndProcessRequest);
            return service.BeginGetFile(data,callback,context);
        }
    }
    public void EndProcessRequest(IAsyncResult result)
    {
        HttpContext context = result.AsyncState as HttpContext;
        byte[] wsoutput;
        using (WebService.RequestService service = new WebService.RequestService())
        {
            wsoutput = service.EndGetFile(result);
        }

        context.Response.ContentType = "application/octet-stream";
        context.Response.ContentEncoding = System.Text.Encoding.Unicode;
        context.Response.AddHeader("Content-Disposition","attachment; filename=attachment.pdf");
        using (System.IO.MemoryStream ms = new System.IO.MemoryStream(wsoutput))
        {
            ms.WriteTo(context.Response.OutputStream);
        }
        context.Response.Flush();
    }


    public bool IsReusable {
        get {
            return false;
        }
    }
}

解决方法

关于你的代码的几点评论:

>您需要在名为BeginGetFile的同一服务实例上调用EndGetFile
>您需要将cb作为AsyncCallBack而不是EndProcessRequest传递

以下是考虑到这些评论的代码:

private class State
{
    public HttpContext Context { get; set; }
    public RequestService Service { get; set; }
}

public void ProcessRequest(HttpContext context)
{
    throw new NotImplementedException();
} 

public IAsyncResult BeginProcessRequest(HttpContext context,Object extraData)
{
    // Don't use using block or it will dispose the service before you can call EndGetFile
    var state = new State
    {
        Service = new RequestService(),Context = context
    };
    // Pass cb here and not EndProcessRequest
    return state.Service.BeginGetFile(cb,state);
}

public void EndProcessRequest(IAsyncResult result)
{
    State state = result.AsyncState as State;
    // Be carefull as this may throw: it is best to put it in a try/finally block
    // so that you dispose properly of the service
    byte[] buffer = state.Service.EndGetFile(result);
    state.Service.Dispose();
    state.Context.Response.ContentType = "application/octet-stream";
    state.Context.Response.AddHeader("Content-Disposition","attachment; filename=attachment.pdf");
    // Write directly into the output stream,and don't call Flush
    state.Context.Response.OutputStream.Write(buffer,buffer.Length);
}

public bool IsReusable 
{ 
    get { return false; } 
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读