Question

Je dois fournir une exportation vers Excel fonctionnalité pour une grande quantité de données renvoyées par un service Web WCF.

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 WCF fois sur service pour une grande quantité de données (environ 5000 lignes) et le jeu de résultats est nul. Quand je déboguer le service, je peux voir la fenêtre pour enregistrer / ouvrir la feuille Excel apparaît avant que le service renvoie le résultat et donc la feuille Excel est toujours vide. S'il vous plaît aidez-moi à comprendre.

ÉDITÉE AJOUTER - IHttpModule d'un site WCF utilisé pour réécrire l'URL est appelé deux ou trois fois. Serait-ce à cause d'un recyclage aspnet_wp? Dans ce cas, je devrais voir l'erreur sur mon journal des événements, non? Mais je ne le fais pas. S'il vous plaît aidez-moi cette question.

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 pourquoi je vois le temps de fonctionnement hors connexion ou fermé exception. Comment puis-je l'empêcher de le faire deux fois. Je crée une seule demande.

Était-ce utile?

La solution 2

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

article m'a aidé à comprendre plus sur WCF service et de repos throttling. Ce qui en fait travaillé pour moi mettait l'attribut ServiceBehavior pour ma classe de service.

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

{      blabla...    }

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 avoir le plaisir de voir tout travail.

Autres conseils

Vous avez exécuté dans l'un des nombreux types de délais d'attente WCF / IIS et limites. Celui-là peut être MaxReceivedMessageSize. Par défaut est de 64 Ko. Configurez ce sur la liaison de 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top