2

假设我有一个基本数学函数的文本文件。

我想做一个回答这些数学函数的网络服务。假设第一个是 y=x*x。如果我想把它变成一个网络服务,我可以简单地这样做:

[WebMethod]
public int A(int x)
{
  return x*x;
}

但是,我已经手动从列表中提取了该函数,并手动将其编码为一个函数。那不是我想做的。我希望在调用时直接从文本文件生成服务的 wsdl,并且我希望对服务的 Web 方法调用转到在运行时也解析文本文件的特定方法。

这是多少重物?我在这个链接上找到了一个关于如何动态生成 W​​SDL 的示例,但除此之外还有很多工作要做,如果项目的某些部分不可行,我不想在这棵树上狂吠。有没有人有任何链接、指南、书籍或尝试这种事情的积极经验?

4

3 回答 3

3

这个相关的 StackOverflow 问题帖子可能会给你一个线索。

这里的提示是使用SoapExtensionReflector类。

如我所见,您可以按如下方式使用该类:

  1. 创建一个包含 1 个虚拟方法的 Web 服务。
  2. 子类化SoapExtensionReflector并在 web.config 中配置它。
  3. 为虚拟方法调用子类后,立即读取包含函数的文件,并为每个函数动态地将方法添加到 WSDL 文件中。

正如您可能同意的那样,这听起来比实际容易,我个人宁愿不去那里。生成的代码可能有点像维护噩梦。

祝你好运 :)

编辑:编写一个小代码生成器实际上可能更容易,它从您的文件中生成带有函数的 C# Web 服务代码。然后,让 WSDL 生成取决于您正在使用的框架(例如 WCF)。

显然,这种方式会破坏它的整个动态方面 + 您需要在函数文件发生更改后重新部署。但话又说回来,“生成代码 - 构建 - 重新部署”的循环可以通过一些 MSBuild 任务轻松自动化。

我想这种解决方案的有用性取决于您的文件功能更改的频率......

于 2010-04-16T11:49:21.667 回答
1

动态 WSDL 是绝对要求吗?没有静态 WSDL 也意味着您不能拥有静态(自动生成的)代理类​​,它是一个真正的 PITA。相反,您可以将函数签名公开为普通的旧数据,而不是 WSDL 元数据:

[ServiceContract]
public interface IMathFunctions
{
  [OperationContract]
  FunctionDescription[] GetFunctionList();

  [OperationContract]
  object RunFunction(string funcName, object[] args);
}

public class FunctionDescription
{
  string Name { get; set; }
  Argument[] Arguments { get; set; }
  TypeCode ReturnType { get; set; }
}

Public class Argument
{
  String Name { get; set; }
  TypeCode Type { get; set; }
}

当使用早于 3.5 SP1 的 .NET 版本时,您将需要在和类上使用[DataContract][DataMember]属性。FunctionDescriptionArgument

于 2010-04-14T11:04:37.280 回答
1

我相信可以在 WCF 中以编程方式添加元数据交换端点——你可能想研究一下。这将允许您动态地将 WSDL 返回给潜在的服务客户端,这些客户端可以在运行时查询您的 Web 服务以确定哪些入口点可用。但这绝对是一项工作——不适合胆小的人。

于 2010-04-09T21:07:42.553 回答