C# 如何调用未在.NET中开发的Web服务

C# 如何调用未在.NET中开发的Web服务,c#,web-services,windows-runtime,C#,Web Services,Windows Runtime,在过去,我有调用WCF服务或ASMX服务的经验,您只需将服务引用添加到.svc或.ASMX url,它就会为您生成代理,然后您就可以使用intellisense来调用这些方法 对于非.net Web服务也是这样吗 我得打电话给你 从winrt应用程序中的c代码,但我不知道如何如果它们是SOAP web服务,那么您仍然可以将Visual Studio指向.WSDL端点并让它生成客户端代理。但这些似乎是REST服务。我认为最好的选择是使用XDocument.Load或类似的方法,然后使用Linq转

在过去,我有调用WCF服务或ASMX服务的经验,您只需将服务引用添加到.svc或.ASMX url,它就会为您生成代理,然后您就可以使用intellisense来调用这些方法

对于非.net Web服务也是这样吗

我得打电话给你


从winrt应用程序中的c代码,但我不知道如何

如果它们是SOAP web服务,那么您仍然可以将Visual Studio指向.WSDL端点并让它生成客户端代理。但这些似乎是REST服务。我认为最好的选择是使用XDocument.Load或类似的方法,然后使用Linq转换为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");

如果它们是SOAPWeb服务,那么您仍然可以将VisualStudio指向.WSDL端点并让它生成客户端代理。但这些似乎是REST服务。我认为最好的选择是使用XDocument.Load或类似的方法,然后使用Linq转换为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");

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

您需要将post请求和响应发送为:

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

例如

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

您需要将post请求和响应发送为:

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

例如

Microsoft Marketing guy将告诉我们,web服务是可互操作的,即使在异构系统中也是如此

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

不久前,我添加了一个用JavaWebLogic构建的Web服务来查询,但不确定该系统,我是在VisualStudio2010的客户端。这有点痛苦,因为:

Visual Studio代理向导仅理解内联架构。在这里,模式是使用wsdl中的引用。VisualStudio不理解这一点 然后我转到svcutil,从命令行生成代理。这无法直接工作,因为WSDL文件中存在一些错误,该文件是由服务提供商手动构建的。我必须要求服务提供商清理它的wsdl文件 代表DTO的xsd文件由多个web服务共享。这会导致在每个代理中重复相同的类,即使不是所有服务都使用。我不得不调整部分类,将其重写为唯一类。 总之,您可以定义术语互操作性的限制。标准说它是可互操作的,但该领域并不总是这样说

我欢迎新出现的rest服务世界。这可以大大简化互操作性。缺点是你可能不得不自己建造一部分管道


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

Microsoft Marketing guy将告诉您,web服务是可互操作的,即使在异构系统中也是如此

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

不久前,我添加了一个用JavaWebLogic构建的Web服务来查询,但不确定该系统,我是在VisualStudio2010的客户端。这有点痛苦,因为:

Visual Studio代理向导仅理解内联架构。在这里,模式是使用wsdl中的引用。VisualStudio不理解这一点 然后我转到svcutil,从命令行生成代理。这无法直接工作,因为WSDL文件中存在一些错误,该文件是由服务提供商手动构建的。我必须要求服务提供商清理它的wsdl文件 代表DTO的xsd文件由多个web服务共享。这会导致在每个代理中重复相同的类,即使不是所有服务都使用。我不得不调整部分类,将其重写为唯一类。 总之,您可以定义术语互操作性的限制。标准说它是可互操作的,但该领域并不总是这样说

我欢迎新出现的rest服务世界。这可以大大简化互操作性。缺点是你可能不得不自己建造一部分管道


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

您尝试过什么吗?喜欢参考
是否正在为项目添加web服务并指向此url?SOAP是不同平台的标准。您尝试过什么吗?比如向项目引用/添加web服务并指向此url?SOAP是不同平台的标准。