5

所有していないWCFサービスにデータを投稿しようとしています。XmlSerializerを使用してメッセージをフォーマットしているため、一重引用符を含むデータで問題が発生します。

このようなノードを持つ

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

サービスに「400badrequest」例外をスローさせます。このように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;
}
4

1 に答える 1

4

このWCFサービスは、ストレートアップクエリ(パラメータ化されていない)を使用してDBにデータを挿入しており、一重引用符をエスケープしていません。私にとってHTTPステータス400は、フレームワークでの逆シリアル化または同様の問題であったことを示唆しているため、これも非常に混乱していました。
みんなご迷惑をおかけして申し訳ありません:(

于 2012-12-21T18:43:45.577 に答える