要動態創建一個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();
但既然你已經說過
Publishin GA 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();
現在你可以使用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)格式的想法_ _「的REST服務是在運行時從一個基於數據庫的配置定義」 - 當我讀到我瑟瑟發抖。這不是一個維護和故障排除嗎? – CodeCaster 2012-07-23 10:06:54
我處理一個非常類似的情況想,如果接受的答案爲你工作 – 2012-10-14 06:15:57
NP難 - 我做了一個驗證的概念,它做了什麼之意。我沒有任何東西滾出去到生產,不過,作爲平衡要求客戶實現REST服務似乎是一個更可靠的選擇,而不是手動解析,並且可以通過手動解析SOAP請求的複雜過程中引入任何錯誤。 – 2012-10-14 10:18:56