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
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…