zoukankan      html  css  js  c++  java
  • 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...重新赋值,如果你的枚举值本身是不连续的,那就会变成连续的错误的值!!

  • 相关阅读:
    java练习题(字符串类):显示4位验证码、输出年月日、从XML中抓取信息
    java练习题:输出100以内与7有关的数、百马百担、打分(去掉最高、最低分)、二分法查找数据、输出直角三角形、正三角形
    MD5加密算法(转)
    Ajax中的局部事件与全局事件
    Ajax实现全国省市三级联动
    关于Cookie中存放于读取中文字符的问题,以及删除Cookie
    JavaScript中的自定义对象以及实现继承特性
    JavaScript中的变量范围以及闭包的概念
    JavaScript全局函数
    Servlet监听器(转)
  • 原文地址:https://www.cnblogs.com/sgang/p/2689168.html
Copyright © 2011-2022 走看看