ChatGPT解决这个技术问题 Extra ChatGPT

.NET 中的 SOAP 客户端 - 参考或示例? [关闭]

关闭。此问题不符合 Stack Overflow 准则。它目前不接受答案。我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。去年关闭。改进这个问题

背景:

我正在创建一个 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 实现的,因此微软的专有解决方案是不可能的服务器端。

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

是否有什么东西阻止您在项目中创建对 WSDL 的 URL 的服务引用?
Frédéric,我的主要问题是我不知道 ASP.NET 如何处理这个问题。什么是“服务参考”?是否可以仅对代码进行操作,或者我必须以某种方式点击?请注意,我需要这个,所以我可以为 J. Random Web Developer 编写可能的文档(即使他们在共享网络托管上)。
@Emil,为了生成 WSDL 文档中描述的类的 C# 代码,需要进行指向和单击。在那之后,如果服务的 URL 永远不会改变,就不会涉及太多代码。请参阅this article on MSDN

K
KyleMit

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

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

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

逐步添加服务引用

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

在 Visual Studio 中打开您的项目(或创建一个新项目) 在解决方案资源管理器中右键单击项目(在项目上而不是解决方案上),然后单击添加服务引用 一个对话框应该出现在下面的屏幕截图中。输入 wsdl 文件的 url,然后点击 Ok。请注意,如果您在点击 ok 后收到错误消息,请尝试从 url 中删除 ?wsdl 部分。我使用 http://www.dneonline.com/calculator.asmx?WSDL 作为示例 在解决方案资源管理器中展开服务引用并双击 CalculatorServiceReference(或您在上一步中命名的服务)。您应该会看到生成的代理类名称和命名空间。在我的例子中,命名空间是 SoapClient.CalculatorServiceReference,代理类的名称是 CalculatorSoapClient。正如我上面所说,类名可能因您的情况而异。转到您的 C# 源代码并使用 WindowsFormsApplication1.ServiceReference1 添加以下内容现在您可以通过这种方式调用服务。 Service1Client 服务 = 新 Service1Client(); int year = service.getCurrentYear();

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


感谢您的回答。我非常感谢屏幕截图和理论描述。即使理论可能很简单,但对我来说仍然是一个新环境。我会试试这个。
没问题 :) 相信我,在实践中也很容易。如果您有任何问题,那么是为了互相帮助,对吗? :-)
Emil,您可能有兴趣知道在上面显示的 GUI 屏幕下方,wsdl.exe 程序正在完成繁重的工作。您可以自己从命令行运行它并查看为您生成的代码。
正如下面另一位评论者所指出的,在 C# 中,Windows Communication Foundation (wcf) 代表了托管服务和调用服务的技术。上面向您展示了如何在 Visual Studio 中自动创建 WCF 代理,并且是执行此操作的多种方法之一,包括使用 wsdl.exe 创建代理,如 mtutty 所述。
我似乎找不到 Service1Client service = new Service1Client(); 在我的 serviceReference 名称空间中只有 WSDL 类?
m
mtutty

我已经做了很多你所说的事情,平台之间的 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> :)


好东西!这不是我要求的,但你仍然回答了我对自己的很多思考。即使在我这里的情况下,“合同优先”似乎也是关键。
J
John Saunders

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

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

j
jesusduarte

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

作为理论总结:

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

这个想法是,你定义一个关于服务做什么和服务提供什么的契约,并定义另一个关于使用哪种通信方法来实际使用服务的契约,无论是 TCP、HTTP 还是 SOAP。

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

更多资源:

Using WCF with PHP5

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


J
John Saunders

你找错地方了。您应该查找 Windows Communication Framework

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


E
Eduardo Lago Aguilar

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-service & WFC 客户端。

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

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