dinghao

记录成长点滴

 

创建使用WebService程序的几点思考

第一,方法的粒度,由于要通过远程访问,方法的粒度过小,会使webservice的调用很频繁,增加网络的负载

    [WebMethod]
        
public int GetAccountID(Guid PassportID, out Guid AccountID)
        
{
            Core.VirtualBank vb 
= new Core.VirtualBank();
            
return vb.GetAccountID( PassportID, out  AccountID);

        }

        [WebMethod]
        
public int GetPassportID(string username, out Guid PassportID)
        
{
                        Core.VirtualBank vb 
= new Core.VirtualBank();
            
return vb.GetPassportID( username, out  PassportID);

        }

        [WebMethod]
        
public int GetAccountIDFromName(string username, out Guid AccountID)
        
{
                        Core.VirtualBank vb 
= new Core.VirtualBank();
            
return vb.GetAccountID(username, out  AccountID);

        }
调用频繁,但是客户用起来比较方便
二,粒度大。一次传多的数据。客户端再封装一次service
如:服务端
[WebMethod]
        
public ShoppingCart[] AllCart(string UserID)
        
{
            ShopCart sc 
= new ShopCart(UserID);
            
return sc.Items;
        }

        [WebMethod]
        
public Product[] GetProductes()
        
{
            Producte p 
= new Producte();
            
return p.GetProductes();
        }

        
        [WebMethod]
        
public Category[] GetCategories()
        
{
            Producte p 
= new Producte();
            
return p.GetCategories();
        }
其中每个Service都返回一个类型的数组,包含了大量的数据
客户端可以自己封装取回的数据
如:客户端
    public static ArrayList GetCategories() 
        
{
            
if ( HttpContext.Current.Cache["Categories"== null ) 
            
{
                 HttpContext.Current.Cache[
"Categories"= GetCategoriesFromDB();
            }

            
return (ArrayList)HttpContext.Current.Cache["Categories"];
        }


        
public static string GetCategoryDescription( int intCategory ) 
        
{
            
string description = null;
            
if ( HttpContext.Current.Cache["Categories1"== null ) 
            
{
                HttpContext.Current.Cache[
"Categories"= GetCategoriesFromDB();
            }

            ArrayList al 
= (ArrayList)HttpContext.Current.Cache["Categories"];
            
for(int i=0;i<al.Count;i++)
            
{
                etpweb.Etp.Category c 
= (etpweb.Etp.Category)al[i];
                
if(c.Id == intCategory)
                
{
                    description 
=  c.Description;
                    
return description;
                }

                

            }

            
return description;
                
        }


        
private static ArrayList GetCategoriesFromDB() 
        
{
        
            etpweb.Etp.BubbleService bs 
= new etpweb.Etp.BubbleService();
            ArrayList al 
= new ArrayList( bs.GetCategories());
            
return al;
        }

客户端取回服务器端的数据后放入缓存,再加上每次取回的数据比较多,对服务器的访问就比较少。
总结:
如果客户端需要很多和服务器的交互,应该提供第二种方式,如果只是调用一个简单的方法,应该用第一种方式
所有服务器端最好提供两种实现
第二种实现比较复杂
因为数据可能会绑定到Datagrid等,Service的返回结果可以用
1。IList,实现起来简单,直接用NHIbernate的Qury.list,只是不是强类型,客户端要做转换
如果没有用到过类型如:SnInfo,webservice的代理类不会生成SnInfo类的代理.要手动修改代理类
即Reference.cs
如:服务器:
    [WebMethod]
        
public IList QuerySnInfoByOem(string type,string Oem)
        
{
        
            
return _sn.QuerySnInfo(Type.GetType(type),Oem);
            
        }
修改:Reference.cs
加上:
public class SNInfo 
    
{
        
Member Variables

        
Constructors

        
Public Properties
    }




2.用类型数组,方便也很简单
服务器端返回类型数组,这样会自动生产代理,也是强类型,需要增加一些属性时,只要修改类型就可以了。
3 用类,其中类的成员是Ilist(ArrayList等集合类型)或者类型数组
优点,客户端使用方便
如:服务器端定义了Products的类,包含Arraylist的 products属性
客户端可以通过Products.products访问

 

posted on 2006-05-25 13:38  思无邪  阅读(758)  评论(1编辑  收藏  举报

导航