Creating and exposing a SOAP service and its WSDL dynamically in C# (with a custom TCP listener!)

前端 未结 3 1474
不知归路
不知归路 2020-12-13 11:42

I\'ve got a custom HTTP server built in C# which accepts requests for REST services and responds with XML or JSON (depending on what the client needs). The REST services are

3条回答
  •  温柔的废话
    2020-12-13 11:53

    To create a wsdl dynamically you can use ServiceDescriptionReflector

    For example: for class

    public class TestWebService
    {
        [WebMethod]
        public string Hello(string namex)
        {
            return "Hello " + namex;
        }
    }
    

    you can use this code

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

    But since you've said

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

    you have to create the Type at runtime

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

    Now you can use type to create 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();
    

    For reading request and forming response, you can use Linq2Xml. Fiddler can give you an idea about SOAP(xml) format sent between client and server

提交回复
热议问题