6

Webサービスで使用するXMLフラグメントを作成する必要があります。xml宣言があると、Webサービスは要求を拒否します。これをサポートするために、次のクラスがあります。

public class ContentQueryCriteria
{
    public int Type { get; set; }
    public string Value { get; set; }
    public int Condition { get; set; }
}

これにより、リクエスト基準を設定して結果を取得できます。

コードは次のように使用されます。

ContentQueryCriteria content = new ContentQueryCriteria();
            content.Type = 1;
            content.Value = "NAVS500";
            content.Condition = 1;

            string requestBody = SerializeToString(content);
            Console.WriteLine(requestBody);

これをXMLファイルにシリアル化すると、XML宣言や名前付けなしで、適​​切な応答が得られます。ただし、ファイルではなくメモリストリームにデータをキャプチャしたいと思います。

次の方法(http://www.codeproject.com/Articles/58287/XML-Serialization-Tips-Tricksから取得)を使用すると、結果を得ることができますが、何らかの理由で?文字列の一部としてリストされます。

public static string SerializeToString(object obj)
{
    XmlSerializer serializer = new XmlSerializer(obj.GetType());
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    MemoryStream ms = new MemoryStream();

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
    settings.Encoding = Encoding.Unicode;
    XmlWriter writer = XmlWriter.Create(ms, settings);
    serializer.Serialize(writer, obj, ns);

    return Encoding.Unicode.GetString(ms.ToArray());

} 

結果の文字列は次のとおりです。

?<ContentQueryCriteria><Type>1</Type><Value>NAVS500</Value><Condition>1</Condition></ContentQueryCriteria>

OmitXmlDeclaration = falseに設定すると、次の文字列が表示されます。

?<?xml version="1.0" encoding="utf-16"?><ContentQueryCriteria><Type>1</Type><Value>NAVS500</Value><Condition>1</Condition></ContentQueryCriteria>

誰かが私がなぜ余分なのかを判断するのを手伝ってもらえますか?ありますか、どうすれば削除できますか?

BOMなしでSerializeToStringメソッドを動作させる

public static string SerializeToString(object obj)
{
    XmlSerializer serializer = new XmlSerializer(obj.GetType());
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");
    MemoryStream ms = new MemoryStream();
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
    settings.Encoding = new UnicodeEncoding(bigEndian: false, byteOrderMark: false);
    XmlWriter writer = XmlWriter.Create(ms, settings);
    serializer.Serialize(writer, obj, ns);

    return Encoding.Unicode.GetString(ms.ToArray());


}
4

1 に答える 1

3

ストリームのバイト配列から変換された文字列の最初の文字としてBOM(バイト順マスク)が表示されています。

BOMの出力をオフにすれば、問題はありません。

BOMを生成しないエンコーディングオブジェクトを使用する:UnicodeEncoding

settings.Encoding = new UnicodeEncoding(bigEndian:false,byteOrderMark:true)
于 2012-07-12T16:52:05.543 に答える