将数据从WCF服务导出到Excel

3

我需要为从WCF Web服务返回的大量数据提供导出到Excel的功能。

加载数据列表的代码如下:

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

我正在使用Response对象来完成任务:
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();

问题在于WCF服务在处理大量数据(约5000行)时会超时,并且结果集为空。当我调试服务时,我可以看到保存/打开Excel表格的窗口出现在服务返回结果之前,因此Excel表格始终为空。请帮助我解决这个问题。
编辑后添加-WCF站点的IHttpModule用于重写URL被调用了两次或三次。这可能是由于aspnet_wp回收引起的吗?如果是这样,我应该在我的应用程序事件日志中看到错误,对吧?但我没有。请帮助我解决这个问题。
这是我的自定义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); 
        } 
    }; 
} 

我看到appln.AuthorizeRequest被调用了两次。我认为这就是为什么我会看到操作超时或连接关闭异常的原因。我该如何阻止它重复调用?我只创建了一个请求。

2个回答

1
您遇到了WCF/IIS超时和限制中的一种。这个特定的问题可能是“MaxReceivedMessageSize”,默认值为64 KB。请在服务绑定上进行配置。
其他限制包括(这些不是所有绑定参数):
  • MaxItemsInObjectGraph(65536)
  • maxRequestLength(4 MB)
  • executionTimeout(90秒)
  • 客户端的sendTimeout(10分钟)

我遇到了“底层连接已关闭”的异常。这是一个REST WCF服务,所以我不得不改变HttpRequest的超时时间。奇怪的是,请求调用只执行一次,但是服务方法会被调用两次或三次,直到出现此异常。我不明白为什么会发生这种情况。我甚至将KeepAlive设置为false,因为我认为请求调用是为了保持连接活动状态,直到返回数据。这只在导出大量数据时发生。可能有解决方法,但我想知道如何修复现有问题,而不是开始解决方法。 - Dave
我编辑了我的问题。我发现当导出整个数据时,IHttpModule的init会被调用两次或三次。当数据相对较小时,这种情况不会发生。这可能是aspnet_wp回收造成的。如果是这样,我该如何解决? - Dave

0

Tor的回答对我有所帮助。我不得不将MaxItemsInObjectGraph设置为更高的值,以消除此异常。然而,我在设置这个值时遇到了麻烦,因为我不知道如何设置和在哪里设置。

这篇文章帮助我更好地理解了WCF Rest服务和节流。实际上对我起作用的是为我的服务类设置ServiceBehavior属性。

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

{ 呃…… }

如果你不担心需要一遍又一遍地更改最大限制,那么你可以在代码中指定它,并享受看到所有工作正常的乐趣。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接