2

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 つだけ作成します。

4

2 に答える 2

1

多くの種類の WCF/IIS タイムアウトと制限のいずれかに遭遇しました。この特定のものは、MaxReceivedMessageSize である可能性があります。デフォルトは 64 KB です。サービスのバインディングでこれを構成します。

その他の制限は次のとおりです (これらはすべてのバインディング パラメーターではありません)。

  • MaxItemsInObjectGraph (65536)
  • maxRequestLength (4 MB)
  • executionTimeout (90 秒)
  • クライアントの sendTimeout (10 分)
于 2010-06-12T11:13:00.193 に答える
0

Torの反応は私を少し助けてくれました。この例外をなくすには、MaxItemsInObjectGraphをより高い値に設定する必要がありました。しかし、設定方法や設定場所がわからなかったため、設定に問題がありました。

この記事は、WCFRestサービスとスロットリングについて理解するのに役立ちました。私にとって実際に機能したのは、サービスクラスのServiceBehavior属性を設定することでした。

[ServiceBehavior(MaxItemsInObjectGraph=2147483646)]
public abstract class MyService: IMyService

{何とか...}

最大制限を何度も変更する必要がない場合は、コードで最大制限を指定することに満足し、すべてが機能することを確認できます。

于 2010-06-17T00:53:26.607 に答える