【问题标题】:Dynamic WSDL Implementation in C#C# 中的动态 WSDL 实现
【发布时间】:2010-08-31 00:15:57
【问题描述】:

我对 .Net 中的网络服务比较陌生,所以如果这是一个新手问题,我深表歉意。

我找到了很多关于如何在 .Net 项目中实现 Web 服务的资源,但它们似乎都涉及到公开方法的静态定义。虽然这可能适用于某些应用程序,但它不符合我的需求。

我想知道的是,有没有办法动态实现 WSDL 中公开的方法,例如 PHP SoapClient 的方式?

【问题讨论】:

  • 听起来你有一个 WSDL,你需要重新创建 web 方法?对吗?
  • 有点。我有一个 WSDL,它有可能在未来发生变化。我正在为客户端工作,需要它能够应对未来的变化,而无需重新编写客户端并静态构建对新变化的支持。

标签: .net web-services soap wsdl


【解决方案1】:

WSDL 确实只是为了帮助定义方法名称和参数,并为您(开发人员)屏蔽所有 HTTP 标头。

听起来您想在运行时提供方法名称和参数。也许解决这个问题的方法是完全忘记 WSDL。进行自己的 HTTP 调用。

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(
      "http://foo.com/Some.asmx"); //build string from .config instead.

//here Register is the name of the method. take yours from config as well if needed
req.Headers.Add("SOAPAction", "\"http://tempuri.org/Register\"");

req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";

详情请参阅文章Invoking Web Service dynamically using HttpWebRequest

.NET 的 Web 服务包装类的一般情况是,它们试图帮助客户端强制执行服务器的 contracts。显然,您试图避免更改静态类型的客户端,如 .NET 包装类所呈现的那样。希望它不会对你来说太繁重。

【讨论】:

  • 感谢您的回复,但我不太确定这是一个足够的解决方案。话虽如此,我将不得不重新考虑我的客户,因为这似乎在我考虑使用的不同消息协议中是一致的。
  • @Skudd:很难绕过。改变合同是一条艰难的道路。归结起来,您正在处理字符串中的方法名称,以及不确定数量的参数。此解决方案消除了 WSDL 和静态类型,并允许您对不断变化的 Web 方法做出快速反应。基本上,它无需重新发现、重新编码、重新编译和重新部署即可控制 HTTP 调用。如果服务器是稳定的,并且/或者使用了不错的版本控制方法,那对你来说肯定会更方便。
猜你喜欢
  • 1970-01-01
  • 2014-02-24
  • 2021-08-28
  • 1970-01-01
  • 2012-04-16
  • 2014-08-06
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多