1

过去,我有调用 WCF 服务或 ASMX 服务的经验,您只需将服务引用添加到 .svc 或 .asmx url 并为您生成代理,然后您就可以调用方法的智能感知。

非 .net 网络服务也一样吗?

我需要调用这个 http://www.earthtools.org/webservices.htm

来自winrt应用程序中的c#代码,但我只是不知道如何

4

3 回答 3

7

如果您有 WSDL,那么您可以添加对该服务的引用。但在这里你尝试调用 REST 服务。

您需要发送发布请求并将响应发送为:

private const string BASE_URL = "http://www.earthtools.org/timezone";
private const string REQUEST_URL_FORMAT = "{0}/{1}/{2}";

public timezone GetTimeZone(double latitude, double longitude)
{
    var uriString = String.Format(REQUEST_URL_FORMAT, BASE_URL, latitude, longitude);
    var requestUri = new Uri(uriString);

    var request = WebRequest.Create(requestUri);
    using (var response = request.GetResponse())
    {
        using (var responseStream = response.GetResponseStream())
        {
            var ser = new XmlSerializer(typeof (timezone));
            var result = (timezone) ser.Deserialize(responseStream);
            return result;
        }
    }
}

示例从这里

于 2012-06-11T08:11:15.903 回答
2

如果它们是 SOAP Web 服务,那么您仍然可以将 Visual Studio 指向 .WSDL 端点并让它生成客户端代理。但这些似乎是 REST 服务。我认为您最好的选择是使用XDocument.Load或类似的东西,然后使用 Linq-to-XML 或 XML 反序列化将 XML 转换为 C# 类。

例如,假设您要调用此服务。获得 lat/lng 结果的简单方法是这样的:

XDocument xdoc = XDocument.Load("http://www.earthtools.org/height/52.4822/-1.8946");
var lat = (decimal)xdoc.Element("location").Element("latitude");
var lng = (decimal)xdoc.Element("location").Element("longitude");
于 2012-06-11T08:08:59.240 回答
1

Microsoft 营销人员会告诉您,Web 服务是可互操作的,即使与异构系统也是如此。

这是一半的真相。Web 服务标准实际上是多平台的。然而,在球场上,它可能会更复杂一些。不同系统的不同理念会导致不同的行为。

不久前,我用 Visual Studio 2010 添加了一个用 Java Web 逻辑(不确定系统,我在客户端)构建的 Web 服务。这有点痛苦,因为:

  1. Visual Studio 代理向导只了解内联架构。这里的模式是 wsdl 中的引用,使用<xsd:import>. Visual Studio 不明白
  2. 然后我转到 svcutil 以从命令行生成代理。由于 WSDL 文件中的一些错误(该文件是由服务提供者手动构建的),这不能直接工作。我必须要求服务提供商清理它的 wsdl 文件
  3. 代表 DTO 的 xsd 文件由多个 Web 服务共享。这会导致在每个代理中重复相同的类,即使不是所有服务都使用。我不得不调整部分类以“重新包装”成独特的类。

总而言之,您可以限制术语“互操作性”。标准说它是可互操作的,但该领域并不总是这样。

我欢迎“休息”服务的新世界。这可以大大简化互操作性。缺点是您可能必须自己构建管道的一部分。

好消息,您提到的服务似乎包含这种休息理念。这并不简单,但您可以构建简单的 Http 请求(post、get 或 put)来查询此服务。

于 2012-06-11T08:14:19.350 回答