在C#中动态创建和公开SOAP服务及其WSDL(使用自定义TCP侦听器!)
我有一个用C#构建的自定义HTTP服务器,它接受REST服务请求并使用XML或JSON响应(取决于客户端需要什么)。 REST服务是在运行时从基于数据库的配置定义的,在输入参数和输出类型方面有很大差异,并且它在生产中运行良好。
但是,我想将SOAP访问添加到相同的服务,并使用适当的WSDL。 由于可用服务不是硬编码,这意味着:
使用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), "https://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, "https://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服务
关于另一种方法的一些想法。
上述就是C#学习教程:在C#中动态创建和公开SOAP服务及其WSDL(使用自定义TCP侦听器!)分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/950991.html