熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

c#動態調用Web Service

2013-11-13 10:02:35  來源: .NET編程 
    看到很多動態調用WebService都只是動態調用地址而已webservice還是同一個才行如果換另外的一個不同的webservice則需重新生成代理類下面的例子稍加修改可以做到只修改配置文件而適應不同的webservice主要原理是根據指定的WebService地址的WSDL然後解析模擬生成一個代理類通過反射調用裡面的方法具體看代碼
    下面是WebService代碼
    using System;
    using SystemCollectionsGeneric;
    using SystemLinq;
    using SystemWeb;
    using SystemWebServices;
    namespace TestWebService
    {
    /// <summary>
    /// Service 的摘要說明
    /// </summary>
    [WebService(Namespace = Description = 我的Web服務)]
    [WebServiceBinding(ConformsTo = WsiProfilesBasicProfile_)]
    [SystemComponentModelToolboxItem(false)]
    // 若要允許使用 ASPNET AJAX 從腳本中調用此 Web 服務請取消對下行的注釋
    // [SystemWebScriptServicesScriptService]
    public class TestWebService : SystemWebServicesWebService
    {
    [WebMethod]
    public string HelloWorld()
    {
    return 測試Hello World;
    }
    [WebMethod]
    public string Test()
    {
    return 測試Test;
    }
    [WebMethod(CacheDuration = Description = 測試)]
    public List<String> GetPersons()
    {
    List<String> list = new List<string>();
    listAdd(測試一);
    listAdd(測試二);
    listAdd(測試三);
    return list;
    }
    }
    }


    下面是客戶端的代碼
    客戶端:
    using System;
    using SystemIO;
    using SystemCollectionsGeneric;
    using SystemLinq;
    using SystemCollections;
    using SystemWeb;
    using SystemNet;
    using SystemReflection;
    using SystemCodeDom;
    using SystemCodeDomCompiler;
    using SystemWebServices;
    using SystemText;
    using SystemWebServicesDescription;
    using SystemWebServicesProtocols;
    using SystemXmlSerialization;
    using SystemWindowsForms;
    namespace ConsoleApplication
    {
    class Program
    {
    static void Main(string[] args)
    {
    WebClient client = new WebClient();
    String url = ;//這個地址可以寫在Config文件裡面這裡取出來就行了在原地址後面加上 ?WSDL
    Stream stream = clientOpenRead(url);
    ServiceDescription description = ServiceDescriptionRead(stream);
    ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//創建客戶端代理代理類
    importerProtocolName = Soap; //指定訪問協議
    importerStyle = ServiceDescriptionImportStyleClient; //生成客戶端代理
    importerCodeGenerationOptions = CodeGenerationOptionsGenerateProperties | CodeGenerationOptionsGenerateNewAsync;
    importerAddServiceDescription(description null null); //添加WSDL文檔
    CodeNamespace nmspace = new CodeNamespace(); //命名空間
    nmspaceName = TestWebService;
    CodeCompileUnit unit = new CodeCompileUnit();
    unitNamespacesAdd(nmspace);
    ServiceDescriptionImportWarnings warning = importerImport(nmspace unit);
    CodeDomProvider provider = CodeDomProviderCreateProvider(CSharp);
    CompilerParameters parameter = new CompilerParameters();
    parameterGenerateExecutable = false;
    parameterOutputAssembly = MyTestdll;//輸出程序集的名稱
    parameterReferencedAssembliesAdd(Systemdll);
    parameterReferencedAssembliesAdd(SystemXMLdll);
    parameterReferencedAssembliesAdd(SystemWebServicesdll);
    parameterReferencedAssembliesAdd(SystemDatadll);
    CompilerResults result = providerCompileAssemblyFromDom(parameter unit);
    if (resultErrorsHasErrors)
    {
    // 顯示編譯錯誤信息
    }
    Assembly asm = AssemblyLoadFrom(MyTestdll);//加載前面生成的程序集
    Type t = asmGetType(TestWebServiceTestWebService);
    object o = ActivatorCreateInstance(t);
    MethodInfo method = tGetMethod(GetPersons);//GetPersons是服務端的方法名稱你想調用服務端的什麼方法都可以在這裡改最好封裝一下
    String[] item = (String[])methodInvoke(o null);
    //注methodInvoke(o null)返回的是一個Object如果你服務端返回的是DataSet這裡也是用(DataSet)methodInvoke(o null)轉一下就行了methodInvoke(null)這裡的null可以傳調用方法需要的參數string[]形式的
    foreach (string str in item)
    ConsoleWriteLine(str);
    //上面是根據WebService地址模似生成一個代理類如果你想看看生成的代碼文件是什麼樣子可以用以下代碼保存下來默認是保存在bin目錄下面
    TextWriter writer = FileCreateText(MyTestcs);
    providerGenerateCodeFromCompileUnit(unit writer null);
    writerFlush();
    writerClose();
    }
    }
    }


From:http://tw.wingwit.com/Article/program/net/201311/12362.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.