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

加载datalist的代码如下:

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

我正在使用 Reponse 对象来完成这项工作:

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 工作表始终为空。请帮我解决这个问题。

编辑添加 - 用于重写 URL 的 WCF 站点的 IHttpModule 被调用两次或三次。这可能是因为 aspnet_wp 回收吗?在这种情况下,我应该在应用程序事件日志中看到错误,对吧?但我不这么认为。请帮我解决这个问题。

这是我的自定义 HttpModule:公共类 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

Tor的回答对我有一点帮助。我必须将 MaxItemsInObjectGraph 设置为更高的值才能消除此异常。但是,我在设置这个值时遇到了麻烦,因为我不知道如何设置它以及在哪里设置它。

文章 帮助我更多地了解 WCF Rest 服务和限制。对我来说真正有用的是设置 服务行为 我的服务类别的属性。

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

{等等...}

如果您不担心必须一遍又一遍地更改最大限制,您可能会很高兴在代码中指定它,并乐于看到它全部工作。

其他提示

您遇到了多种 WCF/IIS 超时和限制之一。这一特定的可能是 MaxReceivedMessageSize。默认值为 64 KB。在服务的绑定上配置此项。

其他限制是(这些并非全部绑定参数):

  • 对象图表中的最大项目数 (65536)
  • 最大请求长度 (4 MB)
  • 执行超时(90 秒)
  • 客户端发送超时(10 分钟)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top