0

Web サービスから奇妙な応答が返されます。

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <GetLemonadeResponse xmlns="http://microsoft.com/webservices/">
      <GetLemonadeResult>&lt;Response&gt;&lt;Status&gt;Error&lt;/Status&gt;&lt;Message&gt;Could not find the Lemonade for this State/Lemon&lt;/Message&gt;&lt;FileNumber /&gt;&lt;/Response&gt;</GetLemonadeResult>
    </GetLemonadeResponse>
  </soap:Body>
</soap:Envelope>

2 つの質問:

1) GetLemonadeResult のコンテンツに逸脱したコンテンツ (「& lt ;」など) が含まれている理由がわかりません。

この方法でバイトを文字列に移行します。

WebClientEx client = new WebClientEx();
client.Headers.Add(HttpRequestHeader.ContentType, "text/xml; charset=utf-8");
client.Encoding = Encoding.UTF8;
byte[] result = client.UploadData(_baseUri.ToString(), data);
client.Encoding.GetBytes(xml));
string resultString = client.Encoding.GetString(result);

(WebClientEx は、追加の Timeout プロパティを使用して WebClient から派生します)。

間違ったエンコーディングを選択すると、応答の外側の部分が同じように壊れてしまうと考えています。

Web サービスにエラーはありますか?

2) Linq to XML を使用して "GetLemonadeResult" を取得しようとすると、何も取得できないのはなぜですか?

var xdoc = XDocument.Parse(response); // returns the XML posted above
var responseAsXML = xdoc.Descendants("GetLemonadeResult"); // gets nothing

XML の GetLemonadeResult タグには "tag:" が付加されていないため、子孫をキャッチするために名前空間が必要になるとは思いもしませんでした。

4

1 に答える 1

2

1) <,> などの xml を無効にする可能性のある一部の文字はエスケープされます

2)コードに名前空間を含めるのを忘れている

var xdoc = XDocument.Parse(response);
XNamespace soap = "http://schemas.xmlsoap.org/soap/envelope/";
XNamespace ns = "http://microsoft.com/webservices/";
var responseAsXML = xdoc.Descendants(soap + "Body")
                        .Descendants(ns + "GetLemonadeResult")
                        .First().Value;

responseAsXMLだろう

<Response>
<Status>Error</Status>
<Message>Could not find the Lemonade for this State/Lemon
</Message><FileNumber />
</Response>

編集

これは私がテストに使用したsoap/xmlです

string response = @"<soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
                        <soap:Body>
                        <GetLemonadeResponse xmlns=""http://microsoft.com/webservices/"">
                            <GetLemonadeResult>&lt;Response&gt;&lt;Status&gt;Error&lt;/Status&gt;&lt;Message&gt;Could not find the Lemonade for this State/Lemon&lt;/Message&gt;&lt;FileNumber /&gt;&lt;/Response&gt;</GetLemonadeResult>
                        </GetLemonadeResponse>
                        </soap:Body>
                    </soap:Envelope>";
于 2013-04-24T19:48:43.450 に答える