2010-06-09 5 views
2

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.

Répondre

0

La réponse de Tor m'a un peu aidé. J'ai dû définir le MaxItemsInObjectGraph à une valeur plus élevée pour cette exception pour disparaître. Cependant, j'ai eu du mal à régler cette valeur parce que je n'ai pas comment la définir et où la définir.

Cette article m'a aidé à mieux comprendre le service de repos WCF et la limitation. Ce qui fonctionnait réellement pour moi était de définir l'attribut ServiceBehavior pour ma classe de service.

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

{ bla ... }

Si vous n'êtes pas préoccupé de devoir changer la limite max plus et plus, vous pourriez être heureux avec la spécification dans le code et ont le plaisir dans le voir tout fonctionner.

1

Vous avez rencontré l'un des nombreux types de délais d'attente et de limites WCF/IIS. Celui-ci peut être MaxReceivedMessageSize. La valeur par défaut est 64 Ko. Configurez ceci sur la liaison du service.

D'autres limites sont (ce ne sont pas tous les paramètres de liaison):

  • MaxItemsInObjectGraph (65536)
  • maxRequestLength (4 Mo)
  • executionTimeout (90 secondes)
  • sendTimeout sur le client (10 minutes)
+0

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

+0

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

Questions connexes