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


76

背景:

我正在创建一个Web服务站点,它将通过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编写可能遵循的文档(即使它们位于共享的Web托管上)。因此,我认为最好的方法应该是仅在代码中执行此操作,但是当然也欢迎使用其他方法执行此操作。


是什么使您无法在项目中创建对WSDL URL的服务引用?
弗雷德里克·哈米迪

1
弗雷德里克,我的主要问题是我不知道ASP.NET如何处理此问题。什么是“服务参考”?是否可以仅对代码执行操作,还是必须以某种方式点击鼠标?请注意,我需要这样做,以便为J. Random Web Developer编写可能遵循的文档(即使它们位于共享的Web托管上)。
EmilVikström,

@Emil,涉及指向和单击,以便为WSDL文档中描述的类生成C#代码。此后,如果服务的URL从不更改,则不需要太多代码。请参阅MSDN上的这篇文章
弗雷德里克·哈米迪

Answers:


153

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

有两种主要方法:

A)ASP.NET服务,这是做SOA的旧方法
。B)WCF,如John所建议的,它是MS的最新框架,并提供了许多协议,包括开放协议和MS专有协议。

逐步添加服务参考

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

  1. 在Visual Studio中打开您的项目(或创建一个新项目)
  2. 在解决方案资源管理器中右键单击该项目(在项目上而不在解决方案上),然后单击“添加服务参考”
  3. 对话框应显示在下面的屏幕快照中。输入您的wsdl文件的URL,然后单击“确定”。请注意,如果单击确定后会收到错误消息,请尝试从URL中删除?wsdl部分。

    添加服务参考对话框

    我以http://www.dneonline.com/calculator.asmx?WSDL为例

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

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

    在我的情况下,名称空间为SoapClient.CalculatorServiceReference,代理类的名称为CalculatorSoapClient。正如我上面所说,类名可能因您的情况而异。

    服务参考代理

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

    using WindowsFormsApplication1.ServiceReference1
    
  6. 现在,您可以通过这种方式致电服务。

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

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


4
感谢您的回答。我非常感谢屏幕截图和理论描述。即使理论很简单,但对我来说仍然是一个新环境。我会尝试的。
EmilVikström,

7
没问题:)相信我,在实践中也很容易。如果您有任何问题,那么SO就是互相帮助吗?:-)
Davita 2011年

Emil,您可能想知道在上面显示的G​​UI屏幕下方,程序wsdl.exe正在执行繁重的工作。您可以从命令行自己运行它,并查看为您生成的代码。
mtutty

1
如下面另一位评论者所述,在C#中,Windows Communication Foundation(wcf)代表了用于托管服务和调用服务的技术。上面显示了如何在Visual Studio中自动创建WCF代理,并且是执行此操作的许多方法之一,包括使用mtutty指出的使用wsdl.exe创建代理。
TRayburn

1
我似乎找不到Service1Client service = new Service1Client();在我的serviceReference名称空间中只有WSDL类?
Zapnologica

25

我已经做了很多您在说的事情,并且平台之间的SOAP互操作性有一个基本规则:CONTRACT FIRST。难道不是派生从代码的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> :)


1
好东西!这不是我要的,但是您仍然回答了我对自己的许多疑问。即使在我这里,“合同第一”似乎也是关键。
EmilVikström,

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

7

看一看“在PHP中使用WCF服务”。它解释了您所需要的基本知识。

作为理论总结:

WCF或Windows Communication Foundation是一项允许定义从调用方式(基础通信方法)中抽象出来的服务的技术。

这个想法是,您定义有关服务功能和服务提供的协定,并且还定义有关使用哪种通信方法实际使用服务的另一协定,可以是TCP,HTTP或SOAP。

您在此处具有本文的第一部分,其中介绍如何创建非常基本的WCF服务。

更多资源:

在PHP5中使用WCF

Aslo看看NuSOAP。如果现在使用NuSphere,则这是一个工具包,可让您从PHP连接到WCF服务。


谢谢。我已经在用PHP进行编码,因此我非常了解NuSOAP。我需要C#的客户端代码。
EmilVikström,


5

在这里,您可以找到一个不错的教程,用于从.NET客户端应用程序调用基于NuSOAP的Web服务。但是IMO,您还应该考虑使用WSO2 PHP Web服务框架(WSO2 WSF / PHP)进行服务。请参阅WSO2 PHP 2.0 Web服务框架显着增强了业界唯一的用于创建SOAP和REST服务的PHP库。还有一个网络研讨会

现在,在.NET世界中,考虑到互操作性问题,我也鼓励使用WCF。可以在此处找到一个互操作性示例,但是此示例使用PHP客户端+ WCF服务,而不是相反的示例。随意实现PHP服务和WFC客户端。

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

一般而言,模式和实践团队总结了与.NET平台有关的各种开源项目中的良好实践和设计,这些项目特别是针对Web的。因此,我认为这是与.NET客户端相关的任何设计决策的良好起点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.