Ric*_* K. 9 .net c# parsing soap dynamic
我有一个用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
例如:对于班级
public class TestWebService
{
[WebMethod]
public string Hello(string namex)
{
return "Hello " + namex;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以使用这段代码
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();
Run Code Online (Sandbox Code Playgroud)
但既然你已经说过了
从数据库中的方法定义发布在运行时生成的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();
Run Code Online (Sandbox Code Playgroud)
现在您可以使用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();
Run Code Online (Sandbox Code Playgroud)
对于读取请求和形成响应,您可以使用Linq2Xml. Fiddler可以让您了解客户端和服务器之间发送的SOAP(xml)格式
| 归档时间: |
|
| 查看次数: |
4680 次 |
| 最近记录: |