処理されるクラスのオブジェクトを作成してそれに割り当てる以外に、データセットを ashx に渡す方法が見つかりませんでした。次に、オブジェクトの ProcessRequest メソッドを呼び出しました。うまくいき、ビルドに成功しました。しかし、ウェブサイトを公開しようとすると、コードはクラス名が見つからないというエラーを出しました。コードは以下のとおりです。
//this is working fine in VS (build succeeded and ProcessRequest returned the file!)
//but didn't compile only on publishing
MyHandler handlerObj = new myHandler();
handlerObj.DataSource = myDataset;
handlerobj.ProcessRequest(Context);
汎用ハンドラーを、コンテキストとデータセットを受け入れるメソッドを持つ通常の c# クラスに置き換えることで、問題を解決しました。次に、クラスでメソッドを呼び出し、ファイル ストリームを Context.Response に書き込んだところ、問題なく動作しました。クラスはハンドラーとまったく同じことを行い、IHttpContext から継承する必要はありません
public void ProcessDownload(HttpContext context, DataSet DataSource)
{
context.Response.Clear();
context.Response.ContentType = "application/vnd.ms-excel";
MemoryStream file = getExcelMemStream(DataSource);
context.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", "myFile.xls"));
context.Response.BinaryWrite(file.GetBuffer());
context.Response.End();
}