none
如何在webservice中抛出xml描述的异常,而不是soap异常 RRS feed

  • 问题

  •  

    我们的webservice应用场景是这样的
        [WebMethod]
        public ChineseMedicineInfo GetChineseMedicineById(string ChinesemeDicineId)
        {
        ...    
        }
       
    其中ChineseMedicineInfo是可序列化[Serializable]的类

    但问题出来了,由于访问webservice是使用的http的post方法,而不是soap协议,当我们抛出SoapException异常时,对方始终显示是500错误,对方要求出错时,不要就500错,最好是一个xml文件,来描述错误代码与错误消息。现在所有项目已接近尾声,不可能将方法返回的ChineseMedicineInfo对象变成string或xmldocument来统一返回的数据类型(如果真这样,也大大增加了同平台操作webservice的难度)。

    尝试使用Global.asax的void Application_Error(object sender, EventArgs e) 方法去抛出新的xml错误,但它对webservice的异常捕获不到;又尝试IIS的500错误指到特定页,由特定页再输出xml错误,但也行不通。

    请问各位有什么高招?谢谢!

    2008年12月16日 8:55

答案

  • 可以采用XmlNode的返回方式。这样非常容易自定义错误。还省去了序列化的开销。
    不过客户端得自己处理xml。

    一种可行的方式是在所有XmlNode里将一个节点作为返回是否成功的标志,如果成功则按正常流程处理xml,如果失败则按错误流程来处理。

    例如:

    <returnCode>0</returnCode>
    <resultEntity>
      <property>value</property>
    </resultEntity>

    0作为成功,其他表示失败。

    <returnCode>-1</returnCode>
    <error>
      <message>parameter can not be null</message>
    </error>

    Facing problems, think first, then search, finally ask.
    2009年2月15日 5:35
    版主

全部回复

  • 如果webservice不能改,你只能改调用方法了,采用SOAP协议进行调用了。


    2009年1月6日 9:17
    版主
  • 可以采用XmlNode的返回方式。这样非常容易自定义错误。还省去了序列化的开销。
    不过客户端得自己处理xml。

    一种可行的方式是在所有XmlNode里将一个节点作为返回是否成功的标志,如果成功则按正常流程处理xml,如果失败则按错误流程来处理。

    例如:

    <returnCode>0</returnCode>
    <resultEntity>
      <property>value</property>
    </resultEntity>

    0作为成功,其他表示失败。

    <returnCode>-1</returnCode>
    <error>
      <message>parameter can not be null</message>
    </error>

    Facing problems, think first, then search, finally ask.
    2009年2月15日 5:35
    版主