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


在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

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐