背景
我正在创建一个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编写文档,以便遵循(即使它们在共享的虚拟主机上)。因此,我认为最好的方法应该是仅在代码中执行此操作,但即使是其他方式也是如此,这当然是受欢迎的。
答案 0 :(得分:130)
据我所知,您希望从C#客户端应用程序调用您的Web服务。您已经拥有该服务并发布了WSDL文件(如果我错了,请更正我)。现在,最简单的方法是在C#应用程序中生成代理类(此过程称为添加服务引用)。有两种主要方式,.NET提供ASP.NET服务,这是旧的SOA方式,而WCF是John建议的,它是MS的最新框架,提供许多协议,包括开放和MS专有协议。
现在,足够的理论让我们一步一步地做到这一点
下面的屏幕截图中将显示一个对话框。输入wsdl文件的url,然后单击Ok。请注意,如果您在点击确定后收到错误消息,请尝试从网址中删除?wsdl部分。
在解决方案资源管理器中展开服务引用,然后双击ServiceReference1(名称可能会有所不同)。您应该看到生成的代理类名称和命名空间。在我的例子中,命名空间是WindowsFormsApplication1.ServiceReference1,代理类的名称是Service1Client。如上所述,课程名称可能因您而异。
转到您的C#源代码。添加using WindowsFormsApplication1.ServiceReference1
。
Service1Client service = new Service1Client();
int year = service.getCurrentYear();
希望这有帮助,如果您遇到任何问题,请告诉我们。
答案 1 :(得分:24)
我已经做了很多你正在谈论的内容,平台之间的SOAP互操作性有一个基本规则:合同第一。 不从代码中派生您的WSDL,然后尝试在不同的平台上生成客户端。除了“Hello World”类型的函数之外,很可能无法生成代码,无法在运行时通话或(我最喜欢的)无法正确发送或接收所有数据而不会引发错误。
那就是说,WSDL是复杂的,令人讨厌的东西,我尽可能避免从头开始编写它。以下是一些可靠的服务互操作指南(使用Web引用,WCF,Axis2 / Java,WS02,Ruby,Python等):
</rant>
:)
答案 2 :(得分:7)
看看“using WCF Services with PHP”。它解释了您需要的基础知识。
作为理论总结:
WCF或Windows Communication Foundation是一种允许定义从方式中抽象出来的服务的技术 - 基础通信方法 - 它们将被调用。
这个想法是你定义一个关于服务的功能和服务提供的合同,并定义另一个关于使用哪种通信方法来实际使用服务的合同,无论是TCP,HTTP还是SOAP。
您有文章here的第一部分,解释了如何创建非常基本的WCF服务。
更多资源:
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)
答案 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 Client,Web Client和Mobile Client。它们可以与WCF结合使用,以明智地调用任何类型的Web服务。
一般来说,patterns & practices team总结了良好做法和设计用于处理.NET平台的各种开源项目,特别是针对Web。因此,对于任何与.NET客户端相关的设计决策,我认为这是一个很好的起点。