質問

WCF Web サービスから返される大量のデータを Excel にエクスポートする機能を提供する必要があります。

データリストをロードするコードは次のとおりです。

List<resultSet> r = myObject.ReturnResultSet(myWebRequestUrl);  //call to WCF service
myDataList.DataSource = r;
myDataList.DataBind();

このジョブを実行するために Response オブジェクトを使用しています。

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 です。パブリック クラス 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 回呼び出されていることがわかります。これが、操作タイムアウトまたは接続クローズ例外が発生している理由だと思います。どうすれば二回繰り返されないようにすることができますか。リクエストは 1 つだけ作成します。

役に立ちましたか?

解決 2

はTorの応答は私に少しを助けました。私は離れて行くためにこの例外のために高い値にMaxItemsInObjectGraphを設定する必要がありました。しかし、私はそれを設定する方法をしなかったため、トラブルにこの値を設定していたし、それをどこに設定します。

この<のhref = "http://www.danrigsby.com/blog/index.php/2008/02/20/how-to-throttle-a-wcf-service-help-prevent-dos-attacks -and-維持-WCF-スケーラビリティ/」のrel = "nofollowをnoreferrer">記事の私は、WCF RESTサービスおよびスロットリングについて詳しく理解して助けました。実際に私のために働いた何が ServiceBehavior の属性を設定しました。私のサービスクラスのために。

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

{      何とか...    }

あなたが最大の限界を超えるとオーバーを変更する必要が心配されていない場合は、コード内でそれを指定すると幸せになると、それはすべての作業を見に楽しみを持っている可能性があります。

他のヒント

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

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

  • オブジェクトグラフの最大項目数 (65536)
  • maxRequestLength (4 MB)
  • 実行タイムアウト (90 秒)
  • クライアント上の sendTimeout (10 分)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top