Frage

Ich brauche eine Excel-Export-Funktion für eine große Menge von Daten aus einem WCF-Webdienst zurück zur Verfügung zu stellen.

Der Code der Datenliste zu laden, ist wie folgt:

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

Ich bin mit dem Reponse Objekt um den Job zu tun:

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();

Das Problem ist, dass WCF Servicezeiten heraus für große Datenmenge (ca. 5000 Zeilen) und die Ergebnismenge null sind. Wenn ich den Dienst debuggen, kann ich das Fenster zum Speichern / Öffnen erscheint die Excel-Tabelle, bevor der Dienst das Ergebnis zurückgibt und damit die Excel-Tabelle immer leer. Bitte helfen Sie mir diese herausfinden.

ADD editierenden - WCF-Website IHttpModule verwendet, um die URL Rewriting wird zweimal oder dreimal aufgerufen wird. Könnte dies wegen einer aspnet_wp recycle sein? In diesem Fall sollte ich den Fehler auf meinem Anwendungsereignisprotokoll sehen werden, nicht wahr? Aber ich weiß nicht. Bitte helfen Sie mir mit diesem Thema.

Hier ist meine benutzerdefinierte 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); 
        } 
    }; 
} 

}

Ich sehe, dass appln.AuthorizeRequest zweimal aufgerufen wird. Ich denke, das ist, warum ich die Betriebszeit sehe oder die Verbindung geschlossen Ausnahme. Wie verhindere ich es von ihm zweimal tun. Ich schaffe nur eine Anfrage.

War es hilfreich?

Lösung 2

Tor Antwort half mir ein wenig. Ich hatte das MaxItemsInObjectGraph auf einen höheren Wert setzen für diese Ausnahme weg zu gehen. Allerdings hatte ich diesen Wert Probleme einstellen, weil ich es nicht täte, wie es eingerichtet und wo sie setzen.

Das Artikel hat mir geholfen, mehr über WCF REST-Service und Drosselung verstehen. Was für mich tatsächlich gearbeitet wurde die Einstellung der ServiceBehavior Attribut für meine Service-Klasse.

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

{      bla ...    }

Wenn Sie nicht betroffen sind etwa mit der max Grenze über und über ändern, können Sie gerne mit ihm in Code hinterlegt und haben den Spaß sie alle Arbeiten zu sehen.

Andere Tipps

Sie haben in einer von vielen Arten von WCF laufen / IIS-Timeouts und Grenzen. Diese besondere kann man MaxReceivedMessageSize sein. Die Standardeinstellung ist 64 KB. Konfigurieren Sie diese auf die Service-Bindung.

Andere Grenzen sind (diese sind nicht alle Bindungsparameter):

  • MaxItemsInObjectGraph (65536)
  • maxRequestLength (4 MB)
  • executionTimeout (90 Sekunden)
  • Sendtimeout auf dem Client (10 Minuten)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top