Domanda

ho bisogno di fornire una funzionalità di esportazione in Excel per una grande quantità di dati restituiti da un servizio WCF web.

Il codice per caricare il datalist è come qui sotto:

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

Sto usando l'oggetto Reponse per fare il lavoro:

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

Il problema è che WCF Servizio volte su per la grande quantità di dati (circa 5000 file) e il set di risultati è nullo. Quando il debug il servizio, posso vedere la finestra per il salvataggio / apertura del foglio Excel compare prima che il servizio restituisce il risultato e quindi il foglio Excel è sempre vuota. Ti prego, aiutami a capire questo fuori.

A cura di aggiungere - IHttpModule del sito WCF utilizzato per riscrivere l'URL che viene chiamato due o tre volte. Questo potrebbe essere a causa di un riciclo aspnet_wp? In quel caso dovrei vedendo l'errore sul mio registro eventi applicazioni, giusto? Ma non lo faccio. Vi prego di aiutare con questo problema.

Questa è mia abitudine HttpModule: Classe CustomHttpModule pubblica: IHttpModule {     Dispose public void () {}

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

}

Vedo che appln.AuthorizeRequest viene chiamato due volte. Penso che questo sia il motivo per cui io sto vedendo il tempo di funzionamento fuori o il collegamento eccezioni chiusa. Come faccio a impedire che farlo due volte. Creo solo una richiesta.

È stato utile?

Soluzione 2

La risposta di Tor mi ha aiutato un po '. Ho dovuto impostare il MaxItemsInObjectGraph ad un valore più alto per questa eccezione di andare via. Tuttavia, ho avuto l'impostazione di questo valore perché non ho come impostarlo e dove impostarlo guai.

Questo articolo mi ha aiutato a capire di più su servizio WCF riposo e limitazione. Ciò che in realtà ha funzionato per me stava tramontando l'attributo ServiceBehavior per la mia classe di servizio.

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

{      bla ...    }

Se non si è preoccupati di dover modificare il limite massimo più e più volte, si potrebbe essere felici con specificando nel codice e hanno il divertimento nel vedere tutto questo lavoro.

Altri suggerimenti

Hai eseguito in uno dei molti tipi di WCF / IIS timeout e limiti. Questo particolare potrebbe essere MaxReceivedMessageSize. Il valore predefinito è 64 KB. Configurare questo sul del servizio di rilegatura.

Altri limiti sono (questi non sono tutti i parametri vincolanti):

  • MaxItemsInObjectGraph (65536)
  • maxRequestLength (4 MB)
  • executionTimeout (90 secondi)
  • sendTimeout sul cliente (10 minuti)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top