gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:48:26 29 4
gpt4 key购买 nike

我有一个用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com