如何在C#中解析SOAP Web服务?

时间:2016-12-31 09:01:06

标签: c# soap

我是C#的新手,运行简单的SOAP Web服务,该Web服务将此返回给我:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:getBillsResponse xmlns:ns2="http://obrs/">
         <return>
            <errorID>7</errorID>
         </return>
      </ns2:getBillsResponse>
   </S:Body>
</S:Envelope>

我的代码用于调用Web服务:

ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
    {
        Console.WriteLine("certificate:" + certificate.GetName() + " sslPolicyErrors:" + sslPolicyErrors);
        return true;
    };
BankWebService.BillingServerService myService = new BankWebService.BillingServerService();
myService.getBill("1","2","3","4","5");
Console.WriteLine("ok");
Console.ReadLine();

我想为getBill输出编写这个C#代码:

if (errorID == 7) then do something...

我该如何实现?

3 个答案:

答案 0 :(得分:1)

如果你的SOAP是任何东西,你的代理代码应该已经有了定义。

你应该可以这样做:

BankWebService.BillingServerService myService = new BankWebService.BillingServerService();
GetBillsResponse response =  // <----------------- NEW
       myService.getBill("1","2","3","4","5");  
  

我想为getBill输出编写这个C#代码:   if (errorID == 7) then do something...

上面有response后,您可以简单地:

var errorID = response.Return.ErrorID;

附录

将您的SOAP填入xmltocsharp我得到

using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace Xml2CSharp
{
    [XmlRoot(ElementName="return")]
    public class Return {
        [XmlElement(ElementName="errorID")]
        public string ErrorID { get; set; }
    }

[XmlRoot(ElementName="getBillsResponse", Namespace="http://obrs/")]
public class GetBillsResponse {
    [XmlElement(ElementName="return")]
    public Return Return { get; set; }
    [XmlAttribute(AttributeName="ns2", Namespace="http://www.w3.org/2000/xmlns/")]
    public string Ns2 { get; set; }
}

[XmlRoot(ElementName="Body", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
public class Body {
    [XmlElement(ElementName="getBillsResponse", Namespace="http://obrs/")]
    public GetBillsResponse GetBillsResponse { get; set; }
}

[XmlRoot(ElementName="Envelope", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
public class Envelope {
    [XmlElement(ElementName="Body", Namespace="http://schemas.xmlsoap.org/soap/envelope/")]
    public Body Body { get; set; }
    [XmlAttribute(AttributeName="S", Namespace="http://www.w3.org/2000/xmlns/")]
    public string S { get; set; }
}

}

答案 1 :(得分:0)

Visual Studio有一个为您解析XML文件的功能:

  • Solution Explorer中,右键单击您所在项目的名称 要添加服务,然后点击添加Service Reference
  • 在“添加服务引用”对话框中,单击Advanced按钮。
  • 在“服务参考设置”对话框中,单击“添加Web Reference
  • URL box中,输入要使用的网络服务的URL
  • Web services found at this URL box中,选择要使用的Web服务 使用。
  • Web reference name field中,输入您要使用的名称 您的代码以编程方式访问所选的Web服务。
  • 点击Add Reference

使用上面的教程允许visual studio将webservice添加到你的项目中,只要你需要它,你只需调用webservice(无论你在web引用名称字段中放置什么)并从中创建一个对象(创建一个实例)从它),你可以很容易地使用如下方法:

using(WebService.MainClass obj = new WebService.MainClass())
{
    int id = obj.GetId("Method Inputs"); 
    return id;
}

答案 2 :(得分:-1)

您需要解析XML以提取所需的字段。有很多方法可以做到这一点。一种方法是使用XmlDocument();

例如,您提供的XML和必填字段;

 private static int ParseErrorIdField(string xml)
    {
        var xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xml);

        var errorIdField = xmlDoc.SelectSingleNode("//*[contains(name(),'errorID')]");
        if (errorIdField == null)
        {
            //couldn't find field in xml
            //return parsing error
            return -1;
        }

        int errorId;

        if (!int.TryParse(errorIdField.InnerText, out errorId))
        {
            //Could not convert field to integer
            //raise error
            return -1;
        }

        return errorId;
    }