在网上搜了一下“动态调用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,转载需保留来源!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。