鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > .net技术 > asp.net编程 > >

WebService 中参数为枚举时引发的血案

来源:互联网 作者:佚名 时间:2012-11-08 10:48
一看是调用WebService时出的错,问题出现在调用的客户端:(因为没有服务器那边的错误,或者说现在还没有成功请求服务器)。服务器那边的源代码: View Code 返回所有游戏服务器列表,包括不能使用的服务器 3 /// 需求:其他系统,需要获取游戏的服务器信息

一看是调用WebService时出的错,问题出现在调用的客户端:(因为没有服务器那边的错误,或者说现在还没有成功请求服务器)。服务器那边的源代码:

View Code

返回所有游戏服务器列表,包括不能使用的服务器 3 /// 需求:其他系统,需要获取游戏的服务器信息 [Obsolete()] )] 9 public List<GameServerInfo> GetAllServerList(GameCategory game) 10 { { 13 GameServer gameServer = new GameServer(game); 14 15 List<GameServerInfo> gameServerList = gameServer.GetAllServerList() as List<GameServerInfo>; 16 17 TranServerCode(game, gameServerList); 18 return gameServerList; 19 } { List<GameServerInfo>(); 23 } 24 }

 

 

原因嘛,是我更新过GameCategory这个枚举,服务端的GameCategory已经是最新的;客户端是不是最新呢?当然不是,看看.net 为我们生成的代理类中的GameCategory:

[System.CodeDom.Compiler.GeneratedCodeAttribute(, )] 3 [System.SerializableAttribute()] )] GameCategory { Virtual, Seal, WenDao, ShenJie, Iuiuu, ZhenBa, ChuangShi, FW, XiYou, Kusomania, Chin, XuanWu, WulinHegemony, Dragon, ShuShan, Ad, Sm, MythsHeroes3, AsktaoLegend, 63 }

 

我当前请求的枚举值是叫 TianMo;发现里面没有吧?这个大家都知道,更新WebService一下引用就行了。

 

而我想说的重点不在于此问题本身,在于WebService参数和返回值的问题。

如果参数是枚举值、复杂的Class,哪一天我们改变一个枚举、一个属性值,就要对所有可以涉及到的地方进行更新引用;如果是简单类型,只要不改变参数的名字,是可以不更新的。

 

此外:对于枚举,引用的WebService还有一个更要命的特性:wsdl生成的代理类(微软自动给你生成的代理类),会把枚举值从0,1,2...重新赋值,如果你的枚举值本身是不连续的,那就会变成连续的错误的值!!

网友评论
<