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

标签 c# .net parsing dynamic soap

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

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

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

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

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

PS:很明显,.NET 框架中有用于此的标准化内容,因为 Visual Studio 为您做了 - 知道如何在运行时在较低级别访问它吗?

最佳答案

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

例如:对于类

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();

既然你说了

Publishing a WSDL generated at runtime from the method definitions in the database

你必须在运行时创建类型

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) 格式

关于c# - 在 C# 中动态创建和公开 SOAP 服务及其 WSDL(使用自定义 TCP 监听器!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11549498/

相关文章:

c# - 为控件快捷方式创建事件方法 - Visual Studio

c# - 如何正确编写自定义任务返回方法

c# - 输入字符串的格式不正确 - 使用了错误的上下文

java - Netbeans Java GUI 计算器 - 如何执行 2 个以上数字的计算?

parsing - 如何在 Haskell 中查看派生实例/派生的生成代码

c# - 如果表存在,则返回 bool 值的 SQL Server 存储过程,c# 实现

c# - 如何正确地从派生类复制字段?

c# - C# 中的属性是否使用反射?

c# - 如何从这个定时器的回调函数中更改 System.Threading.Timer 中的间隔时间?

c# - .net/C# 的 Html 解析器和对象模型