在網上搜了一下“動態調用WebService”相信都能搜出上千篇文章,但是都出自同一個版本:使用ServiceDescriptionImporter導入wsdl然后進行動態編譯,再調用相應的Method返回值。這種方法不足之處就是編譯的時候可能會有些慢,畢竟是編譯整個WebService,而且前臺都是使用同一個方法傳入調用的方法來進行調用的。再者,如果使用了Model,引用了WebService后的Model并非此Model,而且如果是List的話,那更差之千里了,返回的只能是數組。
本人經過思考,用AOP的原理實現了WebService的動態調用,實際上,是調用接口類的方法,然后使用反射得到該方法的返回值,參數等,然后再構造一個WebService的代理類,動態編譯后調用返回值。接下來將一一介紹。
首先定義一個WebService如下。其中使用了FaibClass.Data數據框架。

Code
1 using System;
2 using System.Web;
3 using System.Web.Services;
4 using System.Web.Services.Protocols;
5 using System.Xml.Serialization;
6 using Test.Model;
7 using Test.DA;
8 using FaibClass.Data;
9
10 [WebService(Namespace = "http://tempuri.org/")]
11 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
12 public class Service : System.Web.Services.WebService
13 {
14 public Service () {
15 }
16 [WebMethod]
17 public TCompanyType ATest_GetCompanyType()
18 {
19 ATCompanyType da = new ATCompanyType();
20 da.AccessOptions = AccessOptions.SubEntityList;
21 //排除引用實體屬性
22 da.PropertyFilter = new DebarredAttributes(typeof(ReferenceEntityAttribute));
23 //列出分類
24 return da.Get("Name='大類'", (string[])null);
25 }
26 [WebMethod]
27 public TCompany ATest_GetFirstCompany()
28 {
29 return new ATCompany().Get(null);
30 }
31 [WebMethod]
32 public TCompanies ATest_GetCompanies()
33 {
34 return new ATCompany().Select();
35 }
36 [WebMethod]
37 [XmlInclude(typeof(TCompany))]
38 public bool ATest_Insert(TCompany info)
39 {
40 return true;
41 }
42 [WebMethod]
43 [XmlInclude(typeof(TCompanies))]
44 public bool ATest_InsertAll(TCompanies list)
45 {
46 return true;
47 }
48 [WebMethod]
49 public void ATest_TestNull()
50 {
51 }
52 private void ATest_ListSubType(TCompanyTypes list)
53 {
54 if (list == null) return;
55 foreach (TCompanyType type in list)
56 {
57 //該分類下的公司
58 ATest_ListSubCompany(type.Companies);
59 //該分類下的子類
60 ATest_ListSubType(type.SubCompanyTypes);
61 }
62 }
63
64 //列出分類公司下面的子公司
65 private void ATest_ListSubCompany(TCompanies companies)
66 {
67 if (companies == null) return;
68 foreach (TCompany company in companies)
69 {
70 ATest_ListSubCompany(company.SubCompanies);
71 }
72 }
73 }
NET技術:使用AOP動態調用WebService,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。