gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:05:23 25 4
gpt4 key购买 nike

我们有一个网站,在我们的一个页面中,我们有一个带有文本区域和单选按钮的表单,它使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com