使用动态确定的Web方法编写Web服务

时间:2010-04-09 21:03:21

标签: c# soap isapi

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

我想创建一个能够回答这些数学函数的Web服务。假设第一个是y = x * x。如果我想把它变成一个Web服务,我可以这样做:

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

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

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

3 个答案:

答案 0 :(得分:3)

related StackOverflow question帖子可能会为您带来领先优势。

这里的提示是使用SoapExtensionReflector类。

正如我所看到的,您可以按如下方式使用该类:

  1. 创建包含1个虚拟方法的Web服务。
  2. SoapExtensionReflector进行子类化并在web.config中对其进行配置。
  3. 一旦为虚方法调用子类,请使用函数读取文件,并为每个函数动态添加方法到WSDL文件。
  4. 你可能会同意,这听起来比较容易,我个人宁愿不去那里。结果代码可能是一个维护噩梦。

    祝你好运:)

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

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

    我想这种解决方案的用处取决于你的文件功能改变的频率......

答案 1 :(得分:1)

我相信WCF中的it's possible to add a metadata exchange endpoint programmatically - 你可能想要研究一下。这将允许您动态地将WSDL返回给潜在的服务客户端,这些客户端可以在运行时查询您的Web服务以确定哪些入口点可用。但它确实是一项工作 - 而不是胆小的人。

答案 2 :(得分: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属性。