在C#控制台应用程序中调用Web服务后访问响应节点

时间:2014-04-24 16:29:03

标签: c# .net web-services soap

我目前正在使用C#学习.Net并开始尝试使用Web服务。在另一个线程的某人的帮助下:(Define which Endpoint to use when consuming a Web Service)我设法整理了我的端点,并从我正在使用的Web服务中获得某种形式的响应。我现在唯一的问题是我收到的响应似乎是一个数组,我需要能够解析这个数组中的各个节点。

为了阐明这一点,这里是从调用Web服务返回的XML结构:

<ForecastReturn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ws.cdyne.com/WeatherWS/">
  <Success>true</Success>
  <ResponseText>City Found</ResponseText>
  <State>DE</State>
  <City>Newark</City>
  <WeatherStationCity>Dover AFB</WeatherStationCity>
  <ForecastResult>
    <Forecast>
      <Date>2014-04-22T00:00:00</Date>
      <WeatherID>6</WeatherID>
      <Desciption>Showers</Desciption>
      <Temperatures>
        <MorningLow>45</MorningLow>
        <DaytimeHigh>71</DaytimeHigh>
      </Temperatures>
      <ProbabilityOfPrecipiation>
        <Nighttime>00</Nighttime>
        <Daytime>60</Daytime>
      </ProbabilityOfPrecipiation>
    </Forecast>
  </ForecastResult> 
</ForecastReturn>

我希望能够通过名称或类似方式访问此响应中的节点。因此,如果我声明我想要温度,它将使用result返回温度。在这种情况下,温度似乎不起作用,表明节点不会成为响应对象的属性。

到目前为止,这是我的代码:

Unhandled Exception: System.InvalidOperationException: An endpoint configuration section for contract 'Service1Reference.WeatherSoap'
could not be loaded because more than one endpoint configuration for that contract was found. Please indicate the preferred endpoint configuration section by name.

我的问题是,如何指定我对Web服务的调用应该使用其中一个SOAP端点? 到目前为止我的代码可以在下面找到:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ConsoleApplication1.Service1Reference;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.Write("Enter ZipCode: ");
      var line = Console.ReadLine();
      if (line == null)
      {
        return;
      }

      WeatherSoapClient svc = null;
      bool success = false;
      try
      {
        svc = new WeatherSoapClient();

        var request = line;
        var result = svc.GetCityForecastByZIP(request);

        Console.WriteLine("The result is:");
        Console.WriteLine(result);
        Console.Write("ENTER to continue:");
        Console.ReadLine();

        svc.Close();
        success = true;
      }
      finally
      {
        if (!success && svc != null)
        {
          svc.Abort();
        }
      }
    }
  }
}

如何调整此选项以访问此Web服务的响应中的不同节点?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在这种情况下,某些节点作为数组的一部分返回。使用父容器引用该数组。因此,在上面的示例中,我需要按名称访问节点:

int count = 0;
    int total = result.ForecastResult.Length;
    foreach (var rs in result.ForecastResult){
      if (count > 0)
      {
        Console.WriteLine("************************");
      }
      Console.WriteLine("Date:" + rs.Date);
      Console.WriteLine("Forecast:" + rs.Desciption);
      Console.WriteLine("Temperatures:");
      Console.WriteLine("Morning low - " + rs.Temperatures.MorningLow);
      Console.WriteLine("Daytime high - " + rs.Temperatures.DaytimeHigh);
      count++;
    }
    Console.WriteLine("------------------------------------------------------------------");
    Console.Write("ENTER to continue:");
    Console.ReadLine();

ForecastResult是返回的XML中的父节点,用于描述,日期和温度等。因为预测是7天,所以每天都包含在我们必须循环的预测节点(rs)中以便输出内容。