萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> asp.net編程 >> .NET的動態編譯與WS服務調用詳解

.NET的動態編譯與WS服務調用詳解

這篇文章介紹了.NET的動態編譯與WS服務調用詳解,有需要的朋友可以參考一下,希望對你有所幫助  

    動態編譯與WS服務,有關系麼?今天就亂彈一番,如何使用動態編譯動態生成WS服務調用的代理類,然後通過這個代理類調用WS服務。
    首先,動態編譯這玩意在.NET裡面是非常簡單的,實際上只涉及到兩個類型:CodeDomProvider以及CompilerParameters他們都位於System.CodeDom.Compiler命名空間。
    以下代碼可將源碼動態編譯為一個程序集:
動態編譯

復制代碼 代碼如下:
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters codeParameters = new CompilerParameters();
codeParameters.GenerateExecutable = false; //編譯為dll,如果為true則編譯為exe
codeParameters.GenerateInMemory = true; //編譯後的程序集保存到內存中
StringBuilder code = new StringBuilder();
//此處構造源代碼
CompilerResults results = provider.CompileAssemblyFromSource(codeParameters, code.ToString());
Assembly assembly = null; //動態編譯生成的程序集
if (!results.Errors.HasErrors)
{
    assembly = results.CompiledAssembly;
}


    獲得assembly後,隨後我們即可以通過反射獲取程序集裡面的類型,然後實例化,調用類型方法…
    不過在此之前,我們得構造WS服務的代理類,它是什麼樣子的呢?我們使用WCF框架,創建服務代理類也是十分簡單的,常見的代理類結構如下:
服務調用代理類

復制代碼 代碼如下:
[ServiceContract(Namespace="http://www.jb51.net/")]
public interface TestService
{
    [OperationContract(Action = "http://www.jb51.net/HelloWorld", ReplyAction = "http://www.jb51.net/HelloWorldResponse")]
    string HelloWorld();
}
public class TestServiceClient : ClientBase<TestService>, TestService
{
    public TestServiceClient(Binding binding, EndpointAddress address) :
        base(binding, address)
    {
    }
    public string HelloWorld()
    {
        return base.Channel.HelloWorld();
    }
}


    所以,我們要動態構造出代理類源碼,應該知道服務的命名空間、服務方法的Action地址、ReplyAction地址,當然還有服務方法的名稱,返回類 型,參數列表。這裡,我們省略掉服務方法的參數列表,構造代理類,實際上就是一個字符串組裝的問題,先創建一個類型,用於保存構造代理類所要用到的參數:

服務代理類構造參數

復制代碼 代碼如下:
public class WebServiceParamaters
{
    public string address;
    public string Address
    {
        get { return address; }
        set
        {
            address = value;
        }
    }
    private string serviceNamespace;
    public string ServiceNamespace
    {
        get { return serviceNamespace; }
        set
        {
            serviceNamespace = value;
        }
    }
   private string methodAction;
    public string MethodAction
    {
        get { return methodAction; }
        set
        {
            methodAction = value;
        }
    }
    private string methodReplyAction;
    public string MethodReplyAction
    {
        get { return methodReplyAction; }
        set
        {
            methodReplyAction = value;
        }
    }
    private string methodName;
    public string MethodName
    {
        get { return methodName; }
        set
        {
            methodName = value;
        }
    }
    private string returnType;
    public string ReturnType
    {
        get { return returnType; }
        set
        {
            returnType = value;
        }
    }
}


 好,現在我們只需要構造出代理類源碼,然後動態編譯出代理類的程序集,最後通過反射調用服務方法:
WebServiceProxyCreator

復制代碼 代碼如下:
public class WebServiceProxyCreator
{
    public Object WebServiceCaller(WebServiceParamaters parameters)
    {
        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
        CompilerParameters codeParameters = new CompilerParameters();
        codeParameters.GenerateExecutable = false;
        codeParameters.GenerateInMemory = true;
        StringBuilder code = new StringBuilder();
        CreateProxyCode(code, parameters);
codeParameters.ReferencedAssemblies.Add("System.dll");
codeParameters.ReferencedAssemblies.Add("System.ServiceModel.dll");
        CompilerResults results = provider.CompileAssemblyFromSource(codeParameters, code.ToString());
        Assembly assembly = null;
        if (!results.Errors.HasErrors)
        {
            assembly = results.CompiledAssembly;
        }
        Type clientType = assembly.GetType("RuntimeServiceClient");
       ConstructorInfo ci = clientType.GetConstructor(new Type[] { typeof(Binding), typeof(EndpointAddress) });
        BasicHttpBinding binding = new BasicHttpBinding(); //只演示傳統的WebService調用
        EndpointAddress address = new EndpointAddress(parameters.address);
        Object client = ci.Invoke(new
copyright © 萬盛學電腦網 all rights reserved