WCF服务不支持单引号。

5

我正在尝试向一个我不拥有的WCF服务发送一些数据。我使用XmlSerializer来格式化消息,这会导致包含单引号的数据出现问题。

像这样有一个节点

...
<FirstName>D'Arcy</FirstName>
...

导致服务抛出“400 Bad Request”异常。如果我在Fiddler中手动构造请求,就像这样:
...
<FirstName>D&quot;Arcy</FirstName>
...

那么它就能正常工作。

我很困惑,为什么需要这样做。各种在线XML验证器都声称我的原始XML有效,但WCF不喜欢它?有任何修复或解决方法吗?


以下是我的代码:

static XmlSerializer RequestSerializer = new XmlSerializer(typeof(Message));
static XmlSerializer ResponseSerializer = new XmlSerializer(typeof(int), new XmlRootAttribute("int") { Namespace = "http://schemas.microsoft.com/2003/10/Serialization/" });
static XmlWriterSettings WriterSettings = new XmlWriterSettings { OmitXmlDeclaration = true, CloseOutput = false, Encoding = new UTF8Encoding(false) };


private static int PostData(Message msg)
{
    var request = (HttpWebRequest)WebRequest.Create("https://...");
    request.ContentType = "text/xml;charset=UTF-8";
    request.Method = "POST";

    using (var writer = XmlWriter.Create(request.GetRequestStream(), WriterSettings))
        RequestSerializer.Serialize(writer, msg);

    using (var response = (HttpWebResponse)request.GetResponse())
    using (var responseStream = response.GetResponseStream())
    {
        return (int)ResponseSerializer.Deserialize(responseStream);
    }
}

[XmlRoot("Order", Namespace = "http://...")]
public class Message
{
    public string City;
    public string Coupon;
    public DateTime CreateDate;
    public string Email;
    public string FirstName;
    public string Language;
    public string LastName;
    public int OrderID;
    public string PostalCode;
    public string ProductID;
    public string Province;
    public string StreetAddress1;
    public string StreetAddress2;
}

1
你确定单引号被转义为 " 而不是 ' 吗? - Wiktor Zychla
@WiktorZychla 嗯,你当然是对的。 - Ilia G
@WiktorZychla 奇怪的是,使用 &apos; 会产生与未编码的 ' 相同的问题。 - Ilia G
1个回答

4

原来这个WCF服务使用直接查询(非参数化)来将数据插入到他们的数据库中,并且没有转义单引号。这真的很令人困惑,因为对我来说,HTTP状态码400意味着框架中的反序列化或类似问题。


很抱歉打扰大家 :(


啊,SQL注入大展身手! - Jarek
1
@Pako 是的...当我和负责这件事的人通电话时,我听到了很多摇头和翻白眼的声音。 - Ilia G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接