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

一看是调用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...重新赋值,如果你的枚举值本身是不连续的,那就会变成连续的错误的值!!

原文地址:https://www.cnblogs.com/sgang/p/2689168.html