.NET中的SOAP客户端 - 参考或示例?

时间:2010-06-23 09:34:54

标签: c# wcf soap soap-client

背景

我正在创建一个webservices站点,它将提供基于SOAP和其他协议的许多类型的简单服务。目标是使转换,RSS解析,垃圾邮件检查和许多其他类型的工作变得容易。该网站主要针对初学者开发人员。

我的问题:

我从未开发过任何C#或.NET。很多年前我确实破解了一些VB6,但就是这样。现在我需要一些在C#中通过SOAP进行RPC调用的例子。我试图搜索网络和Stack Overflow,找到这个,但没有找到很多资源,我不知道如何排序资源(哪些是旧的?哪些是不正确的?等等)。

我创建了一个简单的示例服务,在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实现的,因此Microsoft的专有解决方案不在服务器端的问题。

请注意,我需要这样,所以我可以为J. Random Web Developer编写文档,以便遵循(即使它们在共享的虚拟主机上)。因此,我认为最好的方法应该是仅在代码中执行此操作,但即使是其他方式也是如此,这当然是受欢迎的。

6 个答案:

答案 0 :(得分:130)

据我所知,您希望从C#客户端应用程序调用您的Web服务。您已经拥有该服务并发布了WSDL文件(如果我错了,请更正我)。现在,最简单的方法是在C#应用程序中生成代理类(此过程称为添加服务引用)。有两种主要方式,.NET提供ASP.NET服务,这是旧的SOA方式,而WCF是John建议的,它是MS的最新框架,提供许多协议,包括开放和MS专有协议。

现在,足够的理论让我们一步一步地做到这一点

  1. 在visual studio中打开您的项目(或创建一个新项目)
  2. 在解决方案资源管理器中右键单击项目(在项目而不是解决方案上),然后单击添加服务引用
  3. 下面的屏幕截图中将显示一个对话框。输入wsdl文件的url,然后单击Ok。请注意,如果您在点击确定后收到错误消息,请尝试从网址中删除?wsdl部分。 screen

  4. 在解决方案资源管理器中展开服务引用,然后双击ServiceReference1(名称可能会有所不同)。您应该看到生成的代理类名称和命名空间。在我的例子中,命名空间是WindowsFormsApplication1.ServiceReference1,代理类的名称是Service1Client。如上所述,课程名称可能因您而异。 enter image description here

  5. 转到您的C#源代码。添加using WindowsFormsApplication1.ServiceReference1

  6. 现在您可以通过这种方式调用服务。
  7. Service1Client service = new Service1Client();

    int year = service.getCurrentYear();

    希望这有帮助,如果您遇到任何问题,请告诉我们。

答案 1 :(得分:24)

我已经做了很多你正在谈论的内容,平台之间的SOAP互操作性有一个基本规则:合同第一。 从代码中派生您的WSDL,然后尝试在不同的平台上生成客户端。除了“Hello World”类型的函数之外,很可能无法生成代码,无法在运行时通话或(我最喜欢的)无法正确发送或接收所有数据而不会引发错误。

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

  • 继续并按代码优先创建初始WSDL。然后,删除您的代码并从WSDL重新生成服务器类。几乎每个平台都有一个工具。这将向您展示您的特定平台有哪些奇怪的习惯,并且您可以开始调整WSDL以使其更简单,更直接。调整,再生,重复。你会以这种方式学到很多东西,而且它是便携式知识。
  • 坚持复杂类型的普通旧语言类(POCO,POJO等)。不要使用像List&lt;&gt;这样的特定于平台的构造或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>:)

答案 2 :(得分:7)

看看“using WCF Services with PHP”。它解释了您需要的基础知识。

作为理论总结:

WCF或Windows Communication Foundation是一种允许定义从方式中抽象出来的服务的技术 - 基础通信方法 - 它们将被调用。

这个想法是你定义一个关于服务的功能和服务提供的合同,并定义另一个关于使用哪种通信方法来实际使用服务的合同,无论是TCP,HTTP还是SOAP。

您有文章here的第一部分,解释了如何创建非常基本的WCF服务。

更多资源:

Using WCF with PHP5

Aslo看看NuSOAP。如果您现在NuSphere这是一个允许您从PHP连接到WCF服务的工具包。

答案 3 :(得分:7)

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

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

答案 4 :(得分:6)

你正在寻找错误的地方。你应该查找Windows Communication Framework


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

答案 5 :(得分:5)

Here您可以找到一个很好的教程,用于从.NET客户端应用程序调用基于NuSOAP的Web服务。但IMO,你也应该考虑WSO2 Web Services Framework for PHP (WSO2 WSF/PHP)进行服务。见WSO2 Web Services Framework for PHP 2.0 Significantly Enhances Industry’s Only PHP Library for Creating Both SOAP and REST Services。关于它还有一个webminar

现在,在.NET世界中,我还鼓励使用WCF,同时考虑到互操作性问题。可以找到互操作性示例here,但此示例使用PHP客户端+ WCF服务而不是相反。随意实现PHP服务&amp; WFC客户端。

在codeplex.com上有一些WCF相关的开源项目,我发现它非常高效。这些项目对设计和设计非常有用。实现Win Forms和Windows Presentation Foundation应用程序:Smart ClientWeb ClientMobile Client。它们可以与WCF结合使用,以明智地调用任何类型的Web服务。

一般来说,patterns & practices team总结了良好做法和设计用于处理.NET平台的各种开源项目,特别是针对Web。因此,对于任何与.NET客户端相关的设计决策,我认为这是一个很好的起点。