HttpClient读取ASP.NET Web API错误信息的简单方法

在C#中,用HttpClient调用Web API并且通过Content.ReadAsStringAsync()读取响应内容时,如果出现500错误(InternalServerError),会得到一个包含错误信息的json字符串:

{
    "Message":"An error has occurred.",
    "ExceptionMessage":"",
    "ExceptionType":"",
    "StackTrace":"",
    "InnerException":
    {
        "Message":"",
        "ExceptionMessage":"",
        "ExceptionType":",
        "StackTrace":"",
        "InnerException":
        {
            "Message":"",
            "ExceptionMessage":"",
            "ExceptionType":"",
            "StackTrace":""
        }
    }
}

这样一个复杂的字符串可读性很差,通常只需要部分信息(比如ExceptionMessage)就可以知道错误的情况。

那如何读取所需的部分信息呢?

开始用的是 Microsoft.AspNet.WebApi.Client + dynamic,实现代码如下:

var response = await _httClient.GetAsync(url);
dynamic content = await response.Content.ReadAsAsync<ExpandoObject>();
Console.WriteLine(content.ExceptionMessage);

后来一想,这个json字符串也是某种类型的实例序列化出来的,找到这个类型,然后直接反序列化这个类型的实例,岂不更简单。

找了找,发现原来就是Microsoft.AspNet.WebApi.Core中的HttpError:

namespace System.Web.Http
{
    [XmlRoot("Error")]
    public sealed class HttpError : Dictionary<string, object>, IXmlSerializable
    {
        public HttpError();
        public HttpError(string message);
        public HttpError(ModelStateDictionary modelState, bool includeErrorDetail);
        public HttpError(Exception exception, bool includeErrorDetail);
        public string ExceptionMessage { get; set; }
        public string ExceptionType { get; set; }
        public HttpError InnerException { get; }
        public string Message { get; set; }
        public string MessageDetail { get; set; }
        public HttpError ModelState { get; }
        public string StackTrace { get; set; }
        public TValue GetPropertyValue<TValue>(string key);
    }
}

于是改用下面更简单的实现代码:

var response = await _httClient.GetAsync(url);
Console.WriteLine((await response.Content.ReadAsAsync<HttpError>()).ExceptionMessage);

注:需要nuget安装Microsoft.AspNet.WebApi.Client与Microsoft.AspNet.WebApi.Core

时间: 2024-10-09 21:42:40

HttpClient读取ASP.NET Web API错误信息的简单方法的相关文章

使用HttpClient消费ASP.NET Web API服务

本篇体验使用HttpClient消费ASP.NET Web API服务,例子比较简单. 依次点击"文件","新建","项目". 选择"ASP.NET Web API"项目. 在Models文件夹下创建Person.cs类. public class Person { public int Id { get; set; } public string FirstName { get; set; } public string L

使用HttpClient对ASP.NET Web API服务实现增删改查

本篇体验使用HttpClient对ASP.NET Web API服务实现增删改查. 创建ASP.NET Web API项目 新建项目,选择"ASP.NET MVC 4 Web应用程序". 选择"Web API". 在Models文件夹下创建Product类. public class Product { public int Id { get; set; } public string Name { get; set; } public string Categor

通过HttpClient 调用ASP.NET Web API

在前面两篇文章中我们介绍了ASP.NET Web API的基本知识和原理,并且通过简单的实例了解了它的基本(CRUD)操作.我们是通过JQuery和Ajax对Web API进行数据操作.这一篇我们来介绍一下使用HttpClient的方式来对Web API进行数据操作. 这里我们还是继续使用对Product的操作实例来演示一下它的基本应用. 创建ASP.NET Web API应用程序  在VS中选择创建一个ASP.NET Web Application应用程序,在向导的下一个窗口中选择Web AP

学习ASP.NET Web API框架揭秘之“HTTP方法重写”

最近在看老A的<ASP.NET Web API 框架揭秘>,这本书对于本人现阶段来说还是比较合适的(对于调用已经较为熟悉,用其开发过项目,但未深入理解过很多内容为何可以这样“调用”).看到第四章了,有些内容看着虽能理解,但未遇到过具体的问题,看起来也就没有豁然开朗之感.同时,有些内容是一眼就觉得“这是干货”,可能是之前遇到过某些问题,当时用一些搓办法解决,但现在看到书中的示例就如获至宝.所以,就挑些单独能拎出来且马上就能在项目中应用的内容出来与大家分享交流下吧.其中会穿插一些框架中的知识点.不

支持Ajax跨域访问ASP.NET Web Api 2(Cors)的简单示例教程演示

随着深入使用ASP.NET Web Api,我们可能会在项目中考虑将前端的业务分得更细.比如前端项目使用Angularjs的框架来做UI,而数据则由另一个Web Api 的网站项目来支撑.注意,这里是两个Web网站项目了,前端项目主要负责界面的呈现和一些前端的相应业务逻辑处理,而Web Api则负责提供数据. 这样问题就来了,如果前端通过ajax访问Web Api项目话,就涉及到跨域了.我们知道,如果直接访问,正常情况下Web Api是不允许这样做的,这涉及到安全问题.所以,今天我们这篇文章的主

[转]让ASP.NET Web API支持$format参数的方法

本文转自:http://www.cnblogs.com/liuzhendong/p/4228592.html 在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数,只要在WebApiConfig里添加如下三行红色粗体代码即可: using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Net.Http.Format

让ASP.NET Web API支持$format参数的方法

在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数,只要在WebApiConfig里添加如下三行红色粗体代码即可: using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Net.Http.Formatting; namespace ProjectManagementWebAppV4 { public stat

Asp.Net Web API 2第一课——入门

前言 Http不仅仅服务于Web Pages.它也是一个创建展示服务和数据的API的强大平台.Http是简单的.灵活的.无处不在的.你能想象到几乎任何的平台都会有HTTP服务库.HTTP服务可以涉及到范围广泛的客户端,包括浏览器.各种移动设备和传统的桌面应用程序. Asp.Net Web API是在.NET Framework框架上用于建立Web APIs的一个框架.在这个教程中,你将会使用Asp.Net Web API框架来创建一个能够返回产品列表的Web API.前端的Web 页面使用jQu

通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用

REFERENCE FROM : http://www.cnblogs.com/artech/archive/2012/07/04/Knockout-web-api.html 较之面向最终消费者的网站,企业级Web应用对用户体验的要求要低一些.不过客户对“用户体验”的要求是“与日俱增”的,很多被“惯坏了”的用户已经不能忍受Postback带来的页面刷新,所以Ajax在企业级Web应用中得到了广泛的应用.企业级Web应用的一个特点是以“数据处理”为主,所以“面向绑定”的Knockout.js 是一