繁体   English   中英

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

[英]Access response nodes after calling a web service in C# console application

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

为了阐明这一点,这里是从调用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服务的响应中,如何使它适应访问不同的节点?

任何帮助将不胜感激。

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

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天,因此每天都包含在一个预测节点内,为了输出内容,我们必须遍历该节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM