在.NET 中的 SOAP 客户端-引用还是示例?

背景:

我正在创建一个网络服务站点,它将通过 SOAP 和其他协议提供许多类型的简单服务。我们的目标是简化例如转换、 RSS 解析、垃圾邮件检查和许多其他类型的工作。该网站将主要面向初学者开发人员。

我的问题:

我从来没有开发过任何 C # ,或者。网络。很多年前我确实黑进了一些 VB6,但仅此而已。现在我需要一些 在 C # 中通过 SOAP 进行 RPC 调用的例子。我试图搜索网络和堆栈溢出,找到这个,但没有找到很多资源,我不知道如何排序的资源(哪些是旧的?哪个是错的?等)。

我创建了一个简单的示例服务,在 PHP 中如下所示:

<?php
$client = new SoapClient('http://webservi.se/year'); //URL to the WSDL
echo $client->getCurrentYear(); //This method returns an integer, called "year"
?>

现在我想在 C # 中尽可能轻松地调用这个方法。所有的参考文献和例子都是非常受欢迎的。从何说起呢?我可以使用哪些类/模块/什么?

如果有更好的通信框架(后端是可扩展的) ,那么解决方案根本不需要使用 SOAP,但是请注意,服务器端是在 Unix 上用 PHP 实现的,所以微软的专有解决方案在服务器端是不可能的。

请注意,我需要这个,这样我就可以编写文档,让 J。 Random Web Developer 可以遵循(即使他们是在共享的 Web 托管上)。因此,我认为最好的方法应该是仅在代码中进行此操作,但当然,即使是其他方法也是受欢迎的。

215169 次浏览

你找错地方了,你应该查一下 Windows 通信框架


WCF 在客户机和服务器上都使用。

先决条件 : 您已经有了服务和已发布的 WSDL 文件,并且希望从 C # 客户机应用程序调用 Web 服务。

有两种主要的方法可以做到这一点:

A) ASP.NET 服务,这是 SOA 的老方法
B) 周转基金,正如约翰所建议的那样,它是 MS 的最新框架,提供了许多协议,包括开放协议和 MS 专有协议。

逐步添加服务引用

最简单的方法是在 C # 应用程序中生成代理类(这个过程称为添加服务引用)。

  1. 在可视化工作室中打开您的项目(或创建一个新项目)
  2. 在解决方案资源管理器中右键单击项目(在项目上而不是在解决方案上) ,然后单击“添加服务引用”
  3. 一个对话框应该出现在下面的截图中。输入 wsdl 文件的 URL,然后单击 OK。请注意,如果您将收到错误消息后,点击确定,尝试删除?Wsdl 从网址的一部分。

    add service reference dialog

    我使用 http://www.dneonline.com/calculator.asmx?WSDL作为例子

  4. 在解决方案资源管理器中展开服务引用,然后双击 CalculatorServiceReference(或在前一步中命名的任何服务)。

    您应该看到生成的代理类名称和命名空间。

    在我的示例中,名称空间是 SoapClient.CalculatorServiceReference,代理类的名称是 CalculatorSoapClient。正如我上面所说,类名在您的情况下可能会有所不同。

    service reference proxy calss

  5. 转到您的 C # 源代码并添加以下内容

    using WindowsFormsApplication1.ServiceReference1
    
  6. Now you can call the service this way.

    Service1Client service = new Service1Client();
    int year = service.getCurrentYear();
    

Hope this helps. If you encounter any problems, let us know.

看一下“ 与 PHP 一起使用 WCF 服务”,它解释了你所需要的基本知识。

理论总结:

WCF 或 Windows Communication Foundation 是一种技术,它允许定义从调用方式(底层通信方法)抽象出来的服务。

其思想是定义一个关于服务所做的事情和服务提供的内容的契约,并定义另一个关于使用哪种通信方法实际使用服务的契约,可以是 TCP、 HTTP 或 SOAP。

您已经看到了文章 给你的第一部分,解释了如何创建一个非常基本的 WCF 服务。

更多资源:

在 PHP5 下使用 WCF。

再看看 NuSOAP。如果您现在使用的是 NuSphere,那么这个工具包可以让您从 PHP 连接到 WCF 服务。

在这里 您可以找到一个很好的教程,用于从。NET 客户端应用程序。但是,我认为,你也应该考虑 用于 PHP 的 WSO2 Web 服务框架(WSO2 WSF/PHP)的维修。见 WSO2 Web Services Framework for PHP 2.0大大增强了业界唯一用于创建 SOAP 和 REST 服务的 PHP 库。还有一个关于它的 网络研讨会

现在,进去。NET 世界我也鼓励使用 WCF,考虑到互操作性问题。可以找到一个互操作性示例 给你,但是这个示例使用 PHP-client + WCF-service 而不是相反的方法。请随意实现 PHP 服务和 WFC 客户端。

有一些 WCF 相关的开放源码项目,我发现它们非常有成效。这些项目对于设计和实现 WinForms 和 WindowsPresentationFoundation 应用程序(智能客户端网络客户端移动客户端)非常有用。它们可以与 WCF 结合使用,明智地调用任何类型的 Web 服务。

一般来说,模式及练习小组总结了各种开源项目中处理。NET 平台,特别针对网络。因此,我认为这是一个很好的起点,任何设计决策相关。NET 客户端。

我已经完成了您所说的大部分工作,而且平台之间的 SOAP 互操作性有一个基本规则: 先签订合同。执行 没有从代码派生您的 WSDL,然后尝试在不同的平台上生成客户端。任何超过“ Hello World”类型的函数都很可能无法生成代码,在运行时无法通话,或者(我最喜欢的)无法正确地发送或接收所有数据而不会引发错误。

也就是说,WSDL 是复杂的、令人讨厌的东西,我尽可能避免从头开始编写它。下面是一些可靠的服务互操作指南(使用 Web 引用、 WCF、 Axis2/Java、 WS02、 Ruby、 Python 等) :

  • 继续并执行代码优先来创建初始 WSDL。然后,删除代码并从 WSDL 重新生成服务器类。几乎每个平台都有这样的工具。这将向您展示您的特定平台有哪些奇怪的习惯,您可以开始调整 WSDL,使其更简单和更直接。调整,再生,重复。通过这种方式你会学到很多东西,而且这是可移植的知识。
  • 对于复杂类型,坚持使用普通的旧语言类(POCO、 POJO 等)。不要使用特定于平台的构造,如 List < > 或 DataTable。即使是 PHP 关联数组看起来也可以工作,但是在跨平台调试时会出现故障。
  • 坚持使用基本的数据类型: bool、 int、 float、 string、 date (Time)和数组。可能的情况是,对数据类型了解得越详细,随着时间的推移,对新需求的敏捷性就越差。如果可以避免,就不要更改 WSDL。
  • 上面的数据类型有一个例外——给自己一个某种类型的 NameValuePair 机制。你不会相信有多少次,这些东西的清单将节省你的培根在灵活性方面。
  • 为您的 WSDL 设置一个真正的名称空间。这并不难,但你可能不会相信我在名称空间“ http://www.tempuri.org”中看到了多少 Web 服务。另外,使用 URN (“ URN: com-myweb-servicename-v1”,而不是基于 URL 的名称空间(“ http://servicename.myweb.com/v1”)。它不是一个网站,它是一个定义逻辑分组的抽象字符集。可能有十几个人给我打电话寻求支持,说他们去了那个“网站”,但是没有成功。

</rant>:)

如果你可以让它在浏览器中运行,那么像这样简单的东西就可以工作

var webRequest = WebRequest.Create(@"http://webservi.se/year/getCurrentYear");


using (var response = webRequest.GetResponse())
{
using (var rd = new StreamReader(response.GetResponseStream()))
{
var soapResult = rd.ReadToEnd();
}
}