Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

export data from WCF Service to excel

I need to provide an export to excel feature for a large amount of data returned from a WCF web service.

The code to load the datalist is as below:

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

I am using the Reponse object to do the job:

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

The problem is that WCF Service times out for large amount of data (about 5000 rows) and the result set is null. When I debug the service, I can see the window for saving/opening the excel sheet appear before the service returns the result and hence the excel sheet is always empty. Please help me figure this out.

EDITED TO ADD - WCF site's IHttpModule used to rewriting the URL is being called twice or thrice. Could this be because of a aspnet_wp recycle? In that case I should be seeing the error on my Application Event Log, right? But I don't. Please help me with this issue.

Here is my custom 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); 
        } 
    }; 
} 

}

I see that appln.AuthorizeRequest is called twice. I think this is why I am seeing the operation time out or the connection closed exception. How do I stop it from doing it twice. I only create one request.

like image 826
Dave Avatar asked Nov 30 '25 04:11

Dave


1 Answers

You've run into one of many kinds of WCF/IIS timeouts and limits. This particular one may be MaxReceivedMessageSize. Default is 64 KB. Configure this on the service's binding.

Other limits are (these aren't all binding parameters):

  • MaxItemsInObjectGraph (65536)
  • maxRequestLength (4 MB)
  • executionTimeout (90 seconds)
  • sendTimeout on client (10 minutes)
like image 110
Tor Hovland Avatar answered Dec 02 '25 16:12

Tor Hovland



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!