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

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 //排除引用實(shí)體屬性
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技術(shù):使用AOP動(dòng)態(tài)調(diào)用WebService,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。