一看是调用WebService时出的错,问题出现在调用的客户端:(因为没有服务器那边的错误,或者说现在还没有成功请求服务器)。服务器那边的源代码:
View Code
1 /// <summary> 2 /// 返回所有游戏服务器列表,包括不能使用的服务器 3 /// 需求:其他系统,需要获取游戏的服务器信息 4 /// </summary> 5 /// <param name="game">游戏</param> 6 /// <returns>服务器列表</returns> 7 [Obsolete("WebService传递枚举不合适")] 8 [WebMethod(Description = "返回所有游戏服务器列表,包括不能使用的服务器")] 9 public List<GameServerInfo> GetAllServerList(GameCategory game) 10 { 11 try 12 { 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 } 20 catch 21 { 22 return new List<GameServerInfo>(); 23 } 24 }
原因嘛,是我更新过GameCategory这个枚举,服务端的GameCategory已经是最新的;客户端是不是最新呢?当然不是,看看.net 为我们生成的代理类中的GameCategory:
1 /// <remarks/> 2 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")] 3 [System.SerializableAttribute()] 4 [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://service.gyyx.cn/")] 5 public enum GameCategory { 6 7 /// <remarks/> 8 Virtual, 9 10 /// <remarks/> 11 Seal, 12 13 /// <remarks/> 14 WenDao, 15 16 /// <remarks/> 17 ShenJie, 18 19 /// <remarks/> 20 Iuiuu, 21 22 /// <remarks/> 23 ZhenBa, 24 25 /// <remarks/> 26 ChuangShi, 27 28 /// <remarks/> 29 FW, 30 31 /// <remarks/> 32 XiYou, 33 34 /// <remarks/> 35 Kusomania, 36 37 /// <remarks/> 38 Chin, 39 40 /// <remarks/> 41 XuanWu, 42 43 /// <remarks/> 44 WulinHegemony, 45 46 /// <remarks/> 47 Dragon, 48 49 /// <remarks/> 50 ShuShan, 51 52 /// <remarks/> 53 Ad, 54 55 /// <remarks/> 56 Sm, 57 58 /// <remarks/> 59 MythsHeroes3, 60 61 /// <remarks/> 62 AsktaoLegend, 63 }
我当前请求的枚举值是叫 TianMo;发现里面没有吧?这个大家都知道,更新WebService一下引用就行了。
而我想说的重点不在于此问题本身,在于WebService参数和返回值的问题。
如果参数是枚举值、复杂的Class,哪一天我们改变一个枚举、一个属性值,就要对所有可以涉及到的地方进行更新引用;如果是简单类型,只要不改变参数的名字,是可以不更新的。
此外:对于枚举,引用的WebService还有一个更要命的特性:wsdl生成的代理类(微软自动给你生成的代理类),会把枚举值从0,1,2...重新赋值,如果你的枚举值本身是不连续的,那就会变成连续的错误的值!!