1

我正在开发一个通过 SOAP 从 Web 服务下载 XML 文件的 C# 客户端。对于托管在该服务上的一些较旧的记录,XML 显然会遇到埋在其中某处的 0x14,这会引发“无效的空白字符”异常。我正在使用 Linq 将 XML 转储到文件中。有什么方法可以指示 Linq 在不丢失 XML 其余部分的情况下处理无效字符?

编辑:

这是我目前将 XML 放入文件的代码:

 XDocument c =
            new XDocument(
                new XElement(nameSpace + "getCitationsResponse",
                    new XAttribute(XNamespace.Xmlns + "ns1", nameSpace),
                    new XElement("list",
                        record.reportDateSpecified ? new XElement("reportDate", record.reportDate) : null,
                        new XElement("reportType", record.reportType),
                        new XElement("title", record.title),
                        new XElement("projectNumber", record.projectNumber),
                        new XElement("author", record.author),
                        new XElement("abstract", record.@abstract),
                        new XElement("numPages", record.numPages),
                        record.isDataTypeSpecified ? new XElement("isDataType", record.isRestrictedData) : null,
                        new XElement("comments", record.comments),
                        new XElement("attachments", from a in record.attachments
                                                    select new XElement("list",
                                                        new XElement("id", a.id),
                                                        new XElement("filePath", a.filePath),
                                                        new XElement("type", a.type)))));

由于通常的原因,我不得不删除其中的一些内容,但我删除的内容与此处显示的内容相同。

我在发布之前使用了 SoapUI 来查看是否可以找出缺陷所在,但我在 SoapUI中看不到任何内容,它本身也不会产生错误。

编辑#2:

这是确切的错误消息和堆栈跟踪。让我想知道我是否真的可以做点什么,或者我是否只需要做一些事情来记录哪些记录具有无效字符并尝试使用 SoapUI 手动将它们拉下来。

Invalid white space character (0x14) in text to output
   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at Downloader.WebService.ApiService.getRecords(String username, String[] ids)
   at Downloader.Central.RecordLoop(ApiService svc, Int32 offset, String username)

getRecords 是 wsdl 生成的 API 调用,RecordLoop 是我编写的递归函数,用于处理通过 API 调用迭代以查找更新的记录并将它们推送到我已经发布的 Linq 函数。

4

1 回答 1

0

正如上面一些评论中提到的,可以执行不同的忍者技巧以使 SOAP 响应符合 XML 规范。

如果您选择更改响应以使其成为有效的 XML,则必须认真考虑您的更改是否会改变响应的含义。

在我看来,问题不在于您,而在于服务方面。如果可以,您应该尝试让服务所有者升级服务以在其 Web 服务中提供正确格式的 XML。

在处理 3rd 方 Web 服务时,我通常会执行以下操作:

  • 对来自第三个 Web 服务的任何请求和响应启用完整的 XML 模式验证。如果请求或响应不是 XML 模式有效的,那么我们(客户端和服务)就有问题,可能是次要的或主要的 - 但至少它正在被处理。

  • 在尝试修复内容之前,请务必记录任何架构验证错误,以确保它已记录在案。

  • 确保我完全了解修改内容的系统、业务或法律影响。

  • 确保我使用正确的编码格式(UTF8、Latin1 或其他格式)对响应进行编码。

无效内容通常是包含非法 XML 字符的 xml 文本元素。在传输此类文本节点时,服务端应使用 XML 编码或 base64 编码,以保留格式和内容。

在实际更改内容以使其变得有效的更多技术部分,我通常会添加 WCF 行为,这将解决这样做的问题,将修复 xml 的关注点和服务调用的业务目的分开。

如果或当服务被更新以在任何请求下提供有效的 XML 时,也很容易删除 WCF 行为。

于 2014-01-04T11:36:24.543 回答