2012-05-22 80 views
1

我有一個遠程託管的XML SOAP消息,需要在我的ASP.NET MVC C#Web應用程序中讀取。我對所有上述技術都很陌生,所以請在我身上輕鬆一下。閱讀SOAP消息響應ASP.NET MVC4 C#

  1. 如何連接到數據源
  2. 如何創建一個模型到模型的SOAP消息
  3. 什麼是LINQ查詢我需要把獲得「GetMetalQuoteResult」的內容製作成C#對象?例如訪問肥皂消息響應的各個元素。

下面的架構。

<?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 
.... 
.... 

在此先感謝您的幫助。

回答

2

一個很好的選擇可能是生成客戶端代理類。您可以通過在Visual Studio中添加服務引用或使用wsdl.exe命令行工具來執行此操作。這樣,您就可以調用該方法並以常規C#對象的形式接收結果,而無需擔心太多的SOAP基礎結構。

一旦你的客戶端代理,您可以編寫代碼看起來是這樣的:

var client = new ServiceReference.ServiceClient(); 
var result = client.GetMetalQuote(); 
System.Diagnostics.Debug.WriteLine(result.GetMetalQuoteResult.Currency); 
// etc. 
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); 
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); 
    } 
+3

對代碼做什麼的說明es會非常好... – Joel

+0

雖然這篇文章可能會回答這個問題,但添加一些解釋以及可能的鏈接到相關文檔仍然是一個好主意。具有良好解釋和參考的答案通常對當前OP和未來訪問者都更有用。詳盡的答案也更有可能吸引積極的選票。 –