2

ASP.NET MVC C# Web アプリケーション内で読み取る必要がある、リモートでホストされた XML SOAP メッセージがあります。私は上記のテクノロジーのすべてに慣れていないので、気楽にやってください。

  1. データ ソースに接続する方法
  2. SOAP メッセージをモデル化するモデルを作成する方法
  3. 「GetMetalQuoteResult」の内容を C# オブジェクトに変換するために必要な LinQ クエリは何ですか? 例:soap メッセージ応答の個々の要素にアクセスします。

以下のスキーマ。

<?xml version="1.0" encoding="utf-8"?>
<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>
        <GetMetalQuoteResponse xmlns="http://.../...">
            <GetMetalQuoteResult>
                <Type>string</Type>
                <Currency>string</Currency>
                <Date>Date</Date>
                <Time>Time</Time>
                <Rate>decimal</Rate>
                <Bid>decimal</Bid>
                <BidTime>Time</BidTime>
                <ExpTime>DateTime</ExpTime>
                <DisplayTime>Time</DisplayTime>
                <DisplayDate>Date</DisplayDate>
                <Ask>Decimal</Ask>
                <AskTime>Time</AskTime>
            </GetMetalQuoteResult>
        </GetMetalQuoteResponse>
    </soap:Body>
</soap:Envelope>

現在、コントローラー内に次のコードがあります。

var xml = XElement.Load(url);
System.Diagnostics.Debug.WriteLine("");
foreach (XElement x in xml.Nodes())
{
    System.Diagnostics.Debug.WriteLine(x.Name + ":\n"+ x.Value);
}
System.Diagnostics.Debug.WriteLine("");

しかし、これは以下を返すだけです:

{http://schemas.xmlsoap.org/soap/envelope/}
Body:XAUGBP5/22/201212:21:04 PM1000.86251000.862512:21:04 PM2012 May 22 12:21 PM BST1:21:04 PM EDT05/22/121001.249412:21:04 PM

別の行に返す必要があります。

Type: XAU
Currency: GBP
Date: 5/22/201212:21:04
....
....

よろしくお願いします。

4

3 に答える 3

2

適切なオプションは、クライアント プロキシ クラスを生成することです。これを行うには、Visual Studio 内でサービス参照を追加するか、wsdl.exeコマンド ライン ツールを使用します。そうすれば、SOAP インフラストラクチャについてあまり心配することなく、メソッドを呼び出して結果を通常の C# オブジェクトとして受け取ることができます。

クライアント プロキシを取得したら、次のようなコードを記述できます。

var client = new ServiceReference.ServiceClient();
var result = client.GetMetalQuote();
System.Diagnostics.Debug.WriteLine(result.GetMetalQuoteResult.Currency);
// etc.
于 2012-05-22T17:29:58.593 に答える
0
        string url = "http://www..../...";
        var xml = XElement.Load(url);
        XNamespace ns = "http://.../...";
        var results =
            from result in xml.Descendants(ns + "GetMetalQuoteResult")
            select new SpotPriceModel
            {
                Type = result.Element(ns + "Type").Value,
                Currency = result.Element(ns + "Currency").Value,
                ...
                ...
                Ask = (decimal)result.Element(ns + "Ask"),
                AskTime = result.Element(ns + "AskTime").Value
            };

        var spot = results.First();

        System.Diagnostics.Debug.WriteLine("\n\nASK:\t" + spot.Ask + "\n\n");

        return View(spot);
    }
于 2012-05-23T01:26:13.143 に答える
0

これを使用して結果を取得できます。

var result = root1.Descendants()
     .First(x => x.Name.LocalName == "GetMetalQuoteResult")
     .Elements()
     .Select(x => new { Name = x.Name.LocalName, Value = x.Value })
     .ToArray();

結果値を取得するには:

foreach(var x in result)
    System.Diagnostics.Debug.WriteLine(x.Name + ": "+ x.Value);
于 2012-05-22T18:44:18.813 に答える