代码之家  ›  专栏  ›  技术社区  ›  Matt Hamilton

使用WCF的WebGet属性时如何捕获HTTP错误?

  •  1
  • Matt Hamilton  · 技术社区  · 17 年前

    以下是我的运营合同示例:

    [WebGet(UriTemplate = "search/?api_key={key}&query={query}",
       BodyStyle = WebMessageBodyStyle.Bare)]
    [OperationContract]
    XElement Find(string key, string query);
    

    ... 我这样称呼它:

    var factory = new WebChannelFactory<IFooFinder>(
        new Uri("http://api.example.com"));
    var channel = factory.CreateChannel();
    var results = channel.Find(myApiKey, "foo");
    

    发生错误时,“结果”最终成为包含以下XML的XElement:

    <html>
        <head></head>
        <body>
            500 Internal Server Error
        </body>
    </html>
    

    2 回复  |  直到 17 年前
        1
  •  3
  •   marc_s MisterSmith    17 年前

    不,您不能真正抛出异常或SOAP错误,因为您实际上只有HTTP。因此,如果您的服务失败,它可以将其通信回HTTP客户端的唯一方式是通过HTTP状态代码。

    您可以尝试使代码更有意义,例如,不要总是返回500,而是将其拆分为更多细节,或者您可以包含更多描述性错误消息(至少对于开发和测试而言),以提示出错的地方。

    马克

        2
  •  2
  •   Darrel Miller    17 年前

    如果将服务器上的状态代码设置为错误代码,那么我希望客户端将其映射为异常。我知道System.Net.HttpWebRequest如果获得400或500系列状态代码,会在客户端引发WebException。

    在服务器端,如果不想在每个服务实现方法中添加try-catch块,则必须替换System.ServiceModel.Web提供的标准错误处理程序。

    也许有一个更简单的方法。在WCF中,似乎有1001种给同一只猫剥皮的方法。

    推荐文章