c# - 偶尔出现SqlException : "XML parsing: illegal xml character" happens when website submitting form

标签 c# sql-server xml

我们有一个网站,在我们的一个页面中,我们有一个带有文本区域和单选按钮的表单,它使用 jQuery $.ajax() 调用 Web 处理程序 (ashx) 来提交。此处理程序运行 SQL-UPDATE 并写入 XML 类型字段。 Textarea 的输入文本被写入 XML 节点之一,单选按钮值被写入该字段的其他节点。在提交之前,我从输入的文本中删除了非法的 xml 字符。在处理程序中,我再次尝试使用 WebUtility.HtmlEncode() 删除非法字符。
我的问题是,在某些情况下(我无法找到)客户端的文本输入和选择的单选按钮提交将导致此错误:

SqlException: XML parsing: line 28, character 80, illegal xml character

行号在 28 - 29 - 30 -31 之间变化。这些行与通过提交此表单填写的 xml 节点相关。

错误发生在 cmd.ExecuteNonQuery() 行。

我认为关键是“字符80”,这个非法字符不应该存在于输入的文本中,因为XML解析错误总是发生在“字符80”;如果它在输入的文本上,它的位置会从一个错误变为另一个错误,我也尝试了所有单选按钮,但没有一个会导致错误。 这是一个成功更新此页面的 xml,您认为这个字符 80 指的是什么:

<Details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <hasAwardPenalty>true</hasAwardPenalty>
  <TranslatorPayment>177800</TranslatorPayment>
  <TranslatorPaids />
  <ProofreaderPayment>53340</ProofreaderPayment>
  <FileReplace>
    <FileStatus>NONE</FileStatus>
    <AddedTime>0001-01-01T00:00:00</AddedTime>
    <UploadTime>0001-01-01T00:00:00</UploadTime>
    <AffectOnPayment>false</AffectOnPayment>
    <AffectOnScore>false</AffectOnScore>
  </FileReplace>
  <PaymentDetails>
    <AddedTime>2015-02-05T12:02:47.5618565+03:30</AddedTime>
    <PaymentCode>2be92023-9e69-4215-8394-1b81f5b7fc51</PaymentCode>
    <PaymentId>60508</PaymentId>
    <BankResponse>تراکنش موفق</BankResponse>
    <BankName>PASARGAD</BankName>
    <Amount>362700</Amount>
    <Status>PAID</Status>
    <AuthorityCode>6653537</AuthorityCode>
    <Type>SHETAB</Type>
    <OrderId>138587</OrderId>
  </PaymentDetails>
  <MyProperty>0</MyProperty>
  <RequestDate xsi:nil="true" />
  <TranslationPurpose>
    <Id>aa8cf8be-2e7c-42d7-8208-1721bb07299c</Id>
    <TargetCategory>OTHERS</TargetCategory>
    <TargetDescription>سایر</TargetDescription>
    <PublicationMethod>PERSONAL</PublicationMethod>
    <Tone>Formal</Tone>
    <Keynote>FluidityAndLoyality</Keynote>
    <GuidLines>با سلام و احترام و تشکر از زحمات شما لطفا مطابق رزومه جهت کافرمایان خارجی تهیه شود.</GuidLines>
    <References />
    <Modified>true</Modified>
    <AddedTime>2015-02-05T12:18:24.6859596+03:30</AddedTime>
  </TranslationPurpose>
</Details>

更新:您是否认为 Window 的语言(控制面板-->语言-->更改日期时间和数字-->管理员-->非 unicode 程序的语言)以及 IIS 全局化(ASP.NET --> .NET Globalization--> File ) 对这个问题有什么影响吗?

最佳答案

XmlSerializer 类生成可包含无效 XML 字符的 XML(根据 XML 1.0 标准)。特别是,ASCII/Unicode 中的控制字符范围从 U+0001 到 U+001F(U+0009、U+000A 和 U+000D 除外)被 XmlSerializer 编码为数字实体,但是是非法的。

SQL Server 不接受非法的 XML 字符,例如在这个 XML 片段中:

<TargetDescription>abc&#x3;def</TargetDescription>

所以要修复它,您可以通过删除这些非法字符来清理所有字符串:

class XmlHelper
{
    static char[] IllegalXmlCharacters = new char[] {
        '\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\u0007',
        '\u0008', '\u000b', '\u000c', '\u000e', '\u000f', '\u0010', '\u0011',
        '\u0012', '\u0013', '\u0014', '\u0015', '\u0016', '\u0017', '\u0018',
        '\u0019', '\u001a', '\u001b', '\u001c', '\u001d', '\u001e', '\u001f'
    };

    static string RemoveIllegalXmlCharacters(string value)
    {
        string[] validParts = value.Split(IllegalXmlCharacters, StringSplitOptions.RemoveEmptyEntries);
        return String.Join("", validParts);
    }
}

要清理字符串,只需调用静态方法:

var cleanString = XmlHelper.RemoveIllegalXmlCharacters(dirtyString);

关于c# - 偶尔出现SqlException : "XML parsing: illegal xml character" happens when website submitting form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41414201/

相关文章:

sql-server - Azure SQL DB - 资源治理

java - 键盘即将到达 EditText 字段并因此将其隐藏。如何防止键盘隐藏EditText字段?

c# - 识别ajax-jquery中web方法获取的返回值

c# - 使用事件等待句柄阻止窗口关闭,然后包装为异步等待。可以接受吗?

c# - 如何使用 AutoMapper 正确配置 `int?` 到 `int` 投影?

sql - 不使用子查询的高级分组

c# - 无法将类型为 'System.Web.UI.WebControls.Button' 的对象转换为类型 'System.Web.UI.WebControls.CheckBox'

c# - 是否有异常错误类值列表及其含义?具体是sqlexception

java - 尝试使用 SAX 解析 XML,但我的 JUnit 测试都不起作用?

c# - 如何使用 Linq to XML 将 HTML 保存在 XML 文件中?