在C#中动态创建和公开SOAP服务及其WSDL(使用自定义TCP侦听器!)

我有一个用C#构建的自定义HTTP服务器,它接受REST服务请求并使用XML或JSON响应(取决于客户端需要什么)。 REST服务是在运行时从基于数据库的配置定义的,在输入参数和输出类型方面有很大差异,并且它在生产中运行良好。

但是,我想将SOAP访问添加到相同的服务,并使用适当的WSDL。 由于可用服务不是硬编码,这意味着:

  • 从数据库中的方法定义发布在运行时生成的WSDL
  • 解析传入的SOAP请求,将它们映射到这些定义,并确保请求在处理之前符合方法签名
  • 处理响应后,创建符合WDSL的SOAP响应以返回结果

使用Visual Studio在设计时生成Web服务(和WSDL)的MS文档(和Google)文档,使用WebMethods,ASP.NET MVC等公开内容。这不是我正在寻找的,因为没有方法在设计时从中生成绑定的定义。

有没有人有任何想法(例如用于原始SOAP解析的工具包),以及从动态创建的方法签名等生成WSDL的想法? 知道如果不建造这样的东西怎么样? 我希望尽可能避免重新发明轮子。

PS:显然.NET框架中有标准化的东西,因为Visual Studio为你做了 – 任何想法如何在运行时在较低级别访问它?

要动态创建wsdl,可以使用ServiceDescriptionReflector

例如:for class

 public class TestWebService { [WebMethod] public string Hello(string namex) { return "Hello " + namex; } } 

你可以使用这段代码

 StringWriter wr = new StringWriter(); var r = new System.Web.Services.Description.ServiceDescriptionReflector(); r.Reflect(typeof(TestWebService), "http://somewhere.com"); r.ServiceDescriptions[0].Write(wr); var wsdl = wr.ToString(); 

但既然你已经说过了

从数据库中的方法定义发布在运行时生成的WSDL

您必须在运行时创建Type

 var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("MyAsm"), AssemblyBuilderAccess.Run); var mod = asm.DefineDynamicModule("MyModule"); TypeBuilder typeBuilder = mod.DefineType("TestWebService"); MethodBuilder mb = typeBuilder.DefineMethod("Hello", MethodAttributes.Public, CallingConventions.Standard, typeof(string), new Type[] { typeof(string) }); var cab = new CustomAttributeBuilder( typeof(WebMethodAttribute).GetConstructor(new Type[]{}), new object[]{} ); mb.SetCustomAttribute(cab); mb.DefineParameter(1, ParameterAttributes.In, "namex"); mb.GetILGenerator().Emit(OpCodes.Ret); Type type = typeBuilder.CreateType(); 

现在您可以使用type来创建wsdl

 StringWriter wr = new StringWriter(); var r = new System.Web.Services.Description.ServiceDescriptionReflector(); r.Reflect(type, "http://somewhere.com"); r.ServiceDescriptions[0].Write(wr); var wsdl = wr.ToString(); 

对于读取请求和形成响应,您可以使用Linq2Xml。 Fiddler可以让您了解客户端和服务器之间发送的SOAP(xml)格式

SOAP是“仅仅”基于XML的信息交换协议。 从头开始实施对它的支持将是乏味的,但原则上并不是非常复杂,我不这么认为。

官方SOAP规范可以在这里找到。

除非你真的需要解析SOAP,否则让WCF为你做繁重的工作,从你的定义生成C#代码中的服务和数据交换,在运行时编译 。 生成一个通过众所周知的接口挂钩到“静态”代码的服务实现。

使用新服务合同/数据协定的正确绑定动态创建端点。 如果绑定不动态更改,则可以在app.config中定义,否则也在运行时设置它。

添加Mex端点以发布wsdl。

要“检查”传入流量,请使用MessageInspector

使用ServiceHost – > Self Hosting WCF在HTTP服务器中自托管WCF / SOAP服务

关于另一种方法的一些想法。