.NET中的SOAP客户端 – 引用或示例?
背景:
我正在创build一个webservices站点,它将通过SOAP和其他可能的协议提供许多types的简单服务。 我们的目标是简化转换,RSSparsing,垃圾邮件检查以及许多其他types的工作。 该网站将主要针对初学者开发者。
我的问题:
我从来没有开发任何C#或.NET的事情。 多年前我做了一些VB6,但就是这样。 现在我需要一些在C#中通过SOAP进行RPC调用的示例 。 我试图searchnetworking和堆栈溢出,find这个,但没有find许多资源,我不知道如何排名资源(这是旧的?这是不正确的?等)。
我创build了一个简单的示例服务,在PHP中这样调用:
<?php $client = new SoapClient('http://webservi.se/year'); //URL to the WSDL echo $client->getCurrentYear(); //This method returns an integer, called "year" ?>
我现在想在C#中尽可能简单地调用这个方法。 所有参考和例子都非常受欢迎。 我从哪开始呢? 我可以使用哪些类/模块/什么?
如果有更好的通信框架(后端是可扩展的),该解决scheme根本不需要涉及SOAP,但是请注意,服务器端在Unix上是用PHP实现的,所以Microsoft的专有解决scheme是不可能的服务器端。
请注意,我需要这个,所以我可以编写J随机Web开发人员可以遵循的文档(即使他们在共享的networking托pipe)。 因此,我认为最好的方法应该是只用代码来做到这一点,但是其他的做法当然也是受欢迎的。
据我所知你想从C#客户端应用程序调用您的Web服务。 你已经有服务和发布的WSDL文件(纠正我,如果我错了)。 现在,最简单的方法是在C#应用程序中生成代理类(此过程称为添加服务引用)。 有两种主要的方式,.NET提供ASP.NET服务,这是旧的做SOA的方式,WCF是John提出的,这是来自MS的最新框架,提供了许多协议,包括开放和MS专有的协议。
现在,有足够的理论,让我们一步一步来做
- 在Visual Studio中打开您的项目(或创build一个新项目)
- 在解决scheme资源pipe理器中右键单击项目(在项目上,而不是解决scheme),然后单击添加服务引用
-
下面的屏幕截图会显示一个对话框。 input您的wsdl文件的url,然后点击确定。 请注意,如果您在点击确定后收到错误消息,请尝试从url中删除?wsdl部分。
-
在解决scheme资源pipe理器中展开服务引用并双击ServiceReference1(名称可能会有所不同)。 您应该看到生成的代理类名称和名称空间。 在我的情况下,命名空间是WindowsFormsApplication1.ServiceReference1,代理类的名称是Service1Client。 正如我上面所说,类名可能会有所不同,在你的情况。
-
转到您的C#源代码。
using WindowsFormsApplication1.ServiceReference1
添加。 - 现在你可以这样调用服务了。
Service1Client service = new Service1Client();
int year = service.getCurrentYear();
希望这有助于,如果您遇到任何问题,请告诉我们。
我已经完成了很多你正在谈论的事情,平台之间的SOAP互操作性有一个基本的规则:合同优先。 不要从代码派生WSDL,然后尝试在不同的平台上生成客户端。 任何超过“Hello World”types的函数都可能无法生成代码,在运行时无法通话,或者(我最喜欢的)无法正确发送或接收所有数据而不会产生错误。
也就是说,WSDL是复杂的,讨厌的东西,我尽可能避免从头开始写。 以下是可靠的服务互操作指南(使用Web引用,WCF,Axis2 / Java,WS02,Ruby,Python等):
- 继续做代码优先来创build您的初始WSDL。 然后,删除您的代码并从WSDL重新生成服务器类。 几乎每个平台都有这个工具。 这将向您展示您的特定平台有哪些奇怪的习惯,您可以开始调整WSDL,使其更简单,更直接。 调整,重新生成,重复。 你会学到很多东西,而且它是可移植的知识。
- 坚持简单的旧的语言类(POCO,POJO等)的复杂types。 不要使用像List <>或DataTable这样的平台特定的结构。 即使PHP关联数组似乎也能正常工作,但难以跨平台进行debugging。
- 坚持基本的数据types:bool,int,float,string,date(Time)和数组。 可能性是,对于数据types越是特别的关注,随着时间的推移,对新需求的敏捷度越低。 如果你可以避免的话,你不想改变你的WSDL。
- 上述数据types的一个例外 – 给自己一个NameValuePair机制的某种。 你不会相信这些东西的清单能够在灵活性方面节省多less次。
- 为您的WSDL设置一个真实的名称空间。 这并不难,但是你可能不相信我在命名空间“http://www.tempuri.org”中看到过多less个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(); } }
看看“ 使用WCF服务与PHP ”。 它解释了你所需要的基础知识。
作为理论总结:
WCF或Windows Communication Foundation是一种技术,允许定义从这种方式抽象出的服务 – 底层通信方法 – 它们将被调用。
这个想法是,你定义一个关于服务和服务提供什么的合同,并且定义另外一个关于哪个通信方法用来实际使用服务的合同,无论是TCP,HTTP还是SOAP。
本文的第一部分介绍了如何创build非常基本的WCF服务。
更多资源:
使用WCF和PHP5 。
看看NuSOAP。 如果你现在NuSphere这是一个工具包,让你从PHP连接到WCF服务。
你看错了地方。 你应该查找Windows通信框架 。
WCF既用于客户端,也用于服务器。
在这里你可以find一个很好的教程,从.NET客户端应用程序调用基于NuSOAP的Web服务。 但是,IMO还应该考虑用于PHP的WSO2 Web服务框架(WSO2 WSF / PHP)进行维护。 请参阅用于PHP 2.0的WSO2 Web服务框架显着增强了业界唯一的用于创buildSOAP和REST服务的PHP库 。 还有一个关于它的webminar 。
现在,在.NET世界中,我也鼓励使用WCF,同时考虑到互操作性问题。 一个互操作性的例子可以在这里find,但这个例子使用了一个PHP客户端+ WCF服务,而不是相反的。 随意实现PHP服务和WFC客户端。
在codeplex.com上有一些WCF的相关开源项目,我发现它非常有成效。 这些项目对devise和实现Win Forms和Windows Presentation Foundation应用程序非常有用: 智能客户端 , Web客户端和移动客户端 。 它们可以和WCF结合使用,明智地调用任何types的Web服务。
一般来说, 模式和实践团队总结了各种开源项目中的良好实践和devise,这些开源项目专门针对Web开发.NET平台。 所以我认为这是与.NET客户端相关的任何devise决定的一个很好的起点。