读取SOAP消息响应ASP.NET MVC#

读取SOAP消息响应ASP.NET MVC#,c#,xml,asp.net-mvc,soap,asp.net-mvc-4,C#,Xml,Asp.net Mvc,Soap,Asp.net Mvc 4,我有一条远程托管的XML SOAP消息,我需要在ASP.NET MVC#web应用程序中阅读它。我对以上所有技术都是新手,所以请对我放松点 如何连接到数据源 如何创建一个模型来对SOAP消息进行建模 要将“GetMetalQuoteResult”的内容转换为C对象,我需要的LinQ查询是什么?e、 g.访问soap消息响应的各个元素 下面的模式 <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="h

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

  • 如何连接到数据源
  • 如何创建一个模型来对SOAP消息进行建模
  • 要将“GetMetalQuoteResult”的内容转换为C对象,我需要的LinQ查询是什么?e、 g.访问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>
    
    但这只是返回以下结果:

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

    提前感谢您的帮助。

    一个好的选择可能是生成一个客户端代理类。您可以通过在VisualStudio中添加服务引用或使用命令行工具来实现这一点。这样,您就可以调用该方法并将结果作为常规C#对象接收,而不必太担心SOAP基础结构

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

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

    您可以使用此选项获得结果:

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

    虽然这篇文章可能会回答这个问题,但添加一些解释和相关文档的链接仍然是一个好主意。对当前的OP和未来的访客来说,有好的解释和参考的答案通常更有用。完整详细的答案也更有可能吸引正面的选票。
    foreach(var x in result)
        System.Diagnostics.Debug.WriteLine(x.Name + ": "+ x.Value);
    
            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);
        }