假设我有一个基本数学函数的文本文件。
我想创建一个能够回答这些数学函数的Web服务。假设第一个是y = x * x。如果我想把它变成一个Web服务,我可以这样做:
[WebMethod]
public int A(int x)
{
return x*x;
}
但是,我已经手动从列表中提取了函数并手动将其编码为函数。那不是我想要做的。我希望在调用时直接从文本文件生成服务的wsdl,我希望对服务的Web方法调用转到特定的方法,该方法也在运行时解析文本文件。
这是多少重物?我已经找到了一个关于如何在this link动态生成WSDL的示例,但除此之外还有很多工作要做,如果项目的某些部分没有,我不想咆哮这棵树可行。尝试过这种事情,有没有人有任何链接,指南,书籍或积极体验?
答案 0 :(得分:3)
此related StackOverflow question帖子可能会为您带来领先优势。
这里的提示是使用SoapExtensionReflector类。
正如我所看到的,您可以按如下方式使用该类:
SoapExtensionReflector
进行子类化并在web.config中对其进行配置。 你可能会同意,这听起来比较容易,我个人宁愿不去那里。结果代码可能是一个维护噩梦。
祝你好运:) 编辑:编写一个小代码生成器实际上可能更容易,它生成带有函数的文件的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]
类的FunctionDescription
和Argument
属性。