本文档说明了在 Silverlight 应用程序中使用 XtraReports 时最常见的错误。
如果您正遇到运行 Silverlight 项目的问题,那么请继续下列步骤来识别和解决那些问题。
如何识别错误
冒烟测试(Smoke test)
执行“冒烟测试”(验证服务活动是否成功)。 要这样做,则尝试在 Web 浏览器中个别打开报表服务文件 ( .svc)。
要这样做,则在 Visual Studio 环境中,在解决方案资源管理器中使用鼠标右键单击它,然后单击 在浏览器中查看 上下文菜单项。
或者,如果已经把服务部署到 IIS 主机,那么在 Web 浏览器中导航到服务的地址 (例如 http://SomeComputer/BusinessApplication/ReportService.svc)。
成功加载的报表服务的外观与下面的插图有些相像。
如果 Web 浏览器显示了一条异常消息,那么请继续 典型的问题及解决方案 部分。
服务跟踪和 WCF 消息日志
可以使用跟踪来代替调试器,从而理解应用程序如何运行或为什么出错。 要学习更多相关内容,请参阅 MSDN 中的下列主题: 跟踪。
其他两个选项是:
使用 Web 调试的 Fiddler
对于易用且功能强大的 Web 调试工具,可以使用 Fiddler,在 fiddler2.com 可以免费下载和使用。
Silverlight HTTP 客户端堆栈
在默认情况下,Silverlight 应用程序使用浏览器 HTTP 堆栈。 此堆栈不能显示 WCF 服务故障,并且所有 Silverlight 客户应用程序都接收到“Not found”消息。
可以指定在 Silverlight 为基础的应用程序中是由浏览器、还是由客户端提供 HTTP 处理。 要学习更多相关内容,请参阅下列 MSDN 文章: 如何指定浏览器或客户机 HTTP 处理。
使用 WCF 服务配置编辑器来启用跟踪和消息日志
-
在 Visual Studio 主菜单中,展开 工具 菜单并运行 WCF 服务配置编辑器。
- 在此对话框中,找到并打开 web.config 文件。
-
然后在左侧的“配置”树中,选中 诊断(Diagnostics) 节点。 在右侧的窗格中,执行下列操作。
- 启用 日志自动刷新(Log Auto Flush);
- 启用 消息日志记录(Message Logging) (修改日志级别,使得包含所有三个选项: 格式不正确的消息、服务消息、传输消息);
- 启用 跟踪(Tracing)。
-
返回到左侧的“配置”树中,选中 诊断 | 消息日志记录 (Diagnostics | Message Logging)。 在右侧的窗格中,执行下列操作。
- LogEntireMessage = true;
-LogMalformedMessages = true;
- LogMessagesAtServiceLevel = true;
- LogMessagesAtTransportLevel = true;
- MaxMessagesToLog = 10000;
- 增加 MaxSizeOfMessageToLog 属性的默认值 (在大多数情况下 4194304 应该足够了)。
- 保存更改并关闭此编辑器。
人工编辑 web.config
不使用 WCF 服务配置编辑器,也可以人工编辑 web.config 文件。 极少推荐这种方法,因为它导致的错误更多。
-
首先把 diagnostics 段添加到 system.serviceModel。
Xml 复制代码 <system.serviceModel> <diagnostics> <messageLogging logEntireMessage="true" logKnownPii="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="1000000" maxSizeOfMessageToLog="4194304" /> </diagnostics> </system.serviceModel>
-
然后,添加下列段。
Xml 复制代码 <system.diagnostics> <sources> <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing"> <listeners> <add type="System.Diagnostics.DefaultTraceListener" name="Default"> <filter type="" /> </add> <add name="ServiceModelMessageLoggingListener"> <filter type="" /> </add> </listeners> </source> <source name="System.ServiceModel" switchValue="Warning,ActivityTracing" propagateActivity="true"> <listeners> <add type="System.Diagnostics.DefaultTraceListener" name="Default"> <filter type="" /> </add> <add name="ServiceModelTraceListener"> <filter type="" /> </add> </listeners> </source> </sources> <sharedListeners> <add initializeData="D:\Web_messages.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp"> <filter type="" /> </add> <add initializeData="D:\Web_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp"> <filter type="" /> </add> </sharedListeners> <trace autoflush="true" /> </system.diagnostics>
-
另外,取决于服务器的配置,可能需要修改 Web_messages.svclog 和 Web_tracelog.svclog 文件的路径。
典型的问题及解决方案
部署不当
-
错误:
The type 'DevExpress.XtraReports.Service.ReportService, DevExpress.XtraReports.v10.2.Service, Version=10.2.5.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx', provided as the Service attribute value in the ServiceHost directive, or provided in the configuration element system.serviceModel/serviceHostingEnvironment/serviceActivations could not be found.
(参考译文: 在 ServiceHost 指令中作为 Service 属性值的、或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供的类型 'DevExpress.XtraReports.Service.ReportService, DevExpress.XtraReports.v10.2.Service, Version=10.2.5.0, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxx' 无法被找到。) -
解决方案:
首先,确保在 .svc 文件中指定的报表类型名称 (包括程序集名称、版本号、culture 和公钥标记) 是正确的。 然后,使用 程序集绑定日志查看器 来分析程序集加载失败的原因。
使用 程序集绑定日志查看器,或者可以创建测试用 ASP.NET 页面。
Xml 复制代码 <%@ Page Language="C#" %> <%@ Import Namespace="System.Runtime.Remoting" %> <% ObjectHandle handler = Activator.CreateInstance("DevExpress.XtraReports.v10.2.Service", "DevExpress.XtraReports.Service.ReportService"); Response.Write(handler.Unwrap().ToString()); %>
把此页面添加到有 ReportService 的 Web 项目中,然后在浏览器中打开它。 浏览器将显示关于程序集加载失败的更多错误消息。
要在 Visual Studio 中执行此任务,则首先应该启动项目 (使用 IIS,站点已经被寄宿,因此不需要那样)。
默认的数据库配置和 x64 机器
-
错误:
Unable to open database. Connection string: 'Provider=Microsoft.Jet.OLEDB.4.0;Mode=Share Deny None;data source=|DataDirectory|/ReportService.mdb;user id=Admin;password=;'; Error: 'System.InvalidOperationException: The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
(参考译文: 不能打开数据库。 连接字符串: 'Provider=Microsoft.Jet.OLEDB.4.0;Mode=Share Deny None;data source=|DataDirectory|/ReportService.mdb;user id=Admin;password=;'; 错误:'System.InvalidOperationException: 'Microsoft.Jet.OLEDB.4.0' 提供程序在本机没有注册。) -
解决方案:
ReportService 使用数据库来保持会话状态。 在默认情况下使用 MS Access® 数据库。 但是,没有 x64 系统的 MS Access® .NET 数据库提供程序。 因此,应使用 XPO 支持的可以在 x64 操作系统上运行的任何其他数据库。
权限不足,无法打开或修改数据库
-
错误:
Unable to open database. Connection string: 'Provider=Microsoft.Jet.OLEDB.4.0;Mode=Share Deny None;data source=ReportService.mdb;user id=Admin;password=;'; Error: 'System.Data.OleDb.OleDbException (0x80004005): Could not find file 'C:\WINDOWS\system32\ReportService.mdb'.
(参考译文: 无法打开数据库。 连接字符串:'Provider=Microsoft.Jet.OLEDB.4.0;Mode=Share Deny None;data source=ReportService.mdb;user id=Admin;password=;'; 错误:'System.Data.OleDb.OleDbException (0x80004005): 无法找到文件 'C:\WINDOWS\system32\ReportService.mdb'。) -
解决方案:
把 xpf.printing 连接字符串添加到 web.config 中。 如果使用了文件型数据库 (例如 MS Access®),那么请确保数据库文件存在于指定的文件夹中 (要达到此目的,我们推荐使用 App_Data 文件夹),并且应用程序要有足够的权限来读取和修改它。
-
错误:
System.ServiceModel.FaultException: Database schema could not be updated。
(参考译文: System.ServiceModel.FaultException: 无法更新数据库架构。) -
解决方案:
遇到此异常的最常见的原因是 XtraReports 主版本更新。 要解决此问题,应该从 Report Service 用于存储临时数据 (生成的文档、为导出备用的文件等等) 的数据库存储中删除所有表。 要学习更多关于报表服务的内容,请参阅 Silverlight 报表。