Je dois fournir une fonctionnalité d'exportation vers Excel pour une grande quantité de données renvoyées à partir d'un service Web WCF.exporter des données à partir du service WCF pour exceler
Le code pour charger le datalist est comme ci-dessous:
List<resultSet> r = myObject.ReturnResultSet(myWebRequestUrl); //call to WCF service
myDataList.DataSource = r;
myDataList.DataBind();
J'utilise l'objet Reponse pour faire le travail:
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();
Le problème est que les temps de service WCF sur pour grande quantité de données (environ 5000 lignes) et le jeu de résultats est nul. Quand je débogue le service, je peux voir la fenêtre pour sauver/ouvrir la feuille d'Excel apparaît avant que le service renvoie le résultat et par conséquent la feuille d'Excel est toujours vide. S'il vous plaît aidez-moi à comprendre cela.
EDITED TO ADD - Le IHttpModule du site WCF utilisé pour réécrire l'URL est appelé deux fois ou trois fois. Cela pourrait-il être dû à un recyclage aspnet_wp? Dans ce cas, je devrais voir l'erreur sur mon journal des événements de l'application, non? Mais je ne le fais pas. S'il vous plaît aidez-moi avec ce problème.
Voici mon HttpModule personnalisé: 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);
}
};
}
}
Je vois que appln.AuthorizeRequest est appelé deux fois. Je pense que c'est la raison pour laquelle je vois l'expiration de l'opération ou l'exception de la connexion fermée. Comment puis-je l'empêcher de le faire deux fois? Je crée seulement une demande.
Je reçois l'exception "Underlying connection was closed". Ceci est un service WCF REST, donc j'ai dû changer le délai d'attente pour le HttpRequest.Quelque chose de bizarre est l'appel de demande est faite une seule fois, mais la méthode de service est frappé deux fois ou trois fois jusqu'à ce que cette exception se pose. Je ne comprends pas pourquoi cela arrive. J'ai même mis le KeepAlive mis à faux puisque je pensais que les appels de demande sont faits pour maintenir la connexion jusqu'à ce que les données soient retournées. Cela se produit uniquement lors de l'exportation de données volumineuses. Il y a peut-être des solutions, mais j'aimerais savoir comment résoudre le problème existant au lieu de commencer à travailler. – Dave
J'ai édité ma question. Je trouve que lors de l'exportation des données entières, l'init de IHttpModule est appelée deux fois ou trois fois. Cela n'arrive pas lorsque les données sont relativement petites. Cela pourrait-il être aspnet_wp recycler. Si oui, comment le réparer? – Dave