WCF Web サービスから返される大量のデータを Excel にエクスポートする機能を提供する必要があります。
データリストをロードするコードは次のとおりです。
List<resultSet> r = myObject.ReturnResultSet(myWebRequestUrl); //call to WCF service
myDataList.DataSource = r;
myDataList.DataBind();
私は仕事をするためにReponseオブジェクトを使用しています:
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment; filename=MyExcel.xls");
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter tw = new HtmlTextWriter(sw);
myDataList.RenderControl(tw);
Response.Write(sb.ToString());
Response.End();
問題は、大量のデータ (約 5000 行) に対して WCF サービスがタイムアウトし、結果セットが null になることです。サービスをデバッグすると、サービスが結果を返す前に Excel シートを保存/開くためのウィンドウが表示されるため、Excel シートは常に空です。これを理解するのを手伝ってください。
編集して追加 - URL の書き換えに使用される WCF サイトの IHttpModule が 2 回または 3 回呼び出されています。これは aspnet_wp のリサイクルが原因でしょうか? その場合、アプリケーション イベント ログにエラーが表示されるはずですよね? しかし、私はしません。この問題で私を助けてください。
これが私のカスタム HttpModule です: public class CustomHttpModule : IHttpModule { public void Dispose() { }
public void Init(HttpApplication appln)
{
appln.AuthorizeRequest+= delegate
{
HttpContext tcontext= HttpContext.Current;
string path = tcontext.Request.AppRelativeCurrentExecutionFilePath;
int i = path.IndexOf('/', 2);
if (i > 0)
{
string svc = path.Substring(0, i) + ".svc";
string fu = path.Substring(i, path.Length - i);
tcontext.RewritePath(svc, fu, tcontext.Request.QueryString.ToString(), false);
}
};
}
}
appln.AuthorizeRequest が 2 回呼び出されていることがわかります。これが、操作のタイムアウトまたは接続が閉じられたという例外が表示される理由だと思います。2回実行しないようにするにはどうすればよいですか。リクエストを 1 つだけ作成します。