【问题标题】:Read SOAP message response ASP.NET MVC4 C#读取 SOAP 消息响应 ASP.NET MVC4 C#
【发布时间】:2012-05-22 17:25:10
【问题描述】:

我有一个远程托管的 XML SOAP 消息,我需要在我的 ASP.NET MVC C# Web 应用程序中读取它。我对上述所有技术都是新手,所以请放轻松。

  1. 如何连接到数据源
  2. 如何创建模型来为 SOAP 消息建模
  3. 我需要什么 LinQ 查询才能将“GetMetalQuoteResult”的内容转换为 C# 对象?例如访问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
....
....

提前感谢您的帮助。

【问题讨论】:

    标签: c# xml asp.net-mvc soap asp.net-mvc-4


    【解决方案1】:

    一个不错的选择可能是生成一个客户端代理类。您可以通过在 Visual Studio 中添加服务引用或使用wsdl.exe 命令行工具来执行此操作。这样您就可以调用该方法并以常规 C# 对象的形式接收结果,而不必过多担心 SOAP 基础结构。

    拥有客户端代理后,您可以编写如下所示的代码:

    var client = new ServiceReference.ServiceClient();
    var result = client.GetMetalQuote();
    System.Diagnostics.Debug.WriteLine(result.GetMetalQuoteResult.Currency);
    // etc.
    

    【讨论】:

      【解决方案2】:

      您可以使用它来获取结果:

      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);
      

      【讨论】:

        【解决方案3】:
                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);
            }
        

        【讨论】:

        • 虽然这篇文章可能会回答这个问题,但添加一些解释以及可能的相关文档的一些链接仍然是一个好主意。具有良好解释和参考的答案通常对当前的 OP 和未来的访问者都更有用。完整详细的答案也更有可能吸引正面投票。
        猜你喜欢
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 2012-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-01
        • 2015-03-21
        相关资源
        最近更新 更多