WebApiのエラーメッセージをどうカスタマイズです?
本来是发布在客户的Wiki上,所以就用日语写。
------------------------------------------------------------------------
Web Pageの場合、Web.configで
<customErrors mode="On" defaultRedirect="~/Error/HttpError">
<error statusCode="404" redirect="~/Error/NotFound"/>
<error statusCode="503" redirect="~/Error/Maintenance"/>
</customErrors>
を配置すれば、404或いは503エラーの場合、カスタマイズのエラーページに遷移されます。
WebApiの場合はどうする?
特にWeb PageとWebApiのRouteが分かれている場合、Apiへのアクセスが間違っても、カスタマイズのエラーページに遷移しません。
技術不足で、Web.configでどう配置すれば分からないですが、ControllerとActionのほうだけで工夫して仕方がないです。
MVCでは、APIをサクセスする時、まずControllerを探してから、Actionを探します。ControllerとActionが合っていると、Actionに入って、該当するロジックを実行します。
こっちの考えでは、APIをサクセスする時、該当するController或いはActionを検出されない場合、カスタマイズのエラーを返します。
まず「HttpControllerSelector」というControllerを検出するものを実装する。
public class MyHttpControllerSelector : DefaultHttpControllerSelector
{
public MyHttpControllerSelector(HttpConfiguration configuration)
: base(configuration)
{
} public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
HttpControllerDescriptor descriptor = null;
try
{
descriptor = base.SelectController(request);
}
catch(Exception e)
{
APIResult<string> apiResult = new APIResult<string>()
{
StatusCode = StatusCode.UnexpectedError
};
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ObjectContent<APIResult<string>>(apiResult, new JsonMediaTypeFormatter())
}; Trace.WriteLine(e.Message);
// Controllerが検出されない場合、直接カスタマイズのResponseを返します。
throw new HttpResponseException(response); }
return descriptor; }
}
以上のやつを実装終われば、「Global.asax.cs」にレジストなくてはなりません。
protected void Application_Start()
{
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector), new MyHttpControllerSelector(GlobalConfiguration.Configuration));
}
次はActionの検知処理です。
public class BaseApiController : ApiController
{
public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, System.Threading.CancellationToken cancellationToken)
{
Task<HttpResponseMessage> result;
try
{
result = base.ExecuteAsync(controllerContext, cancellationToken);
}
catch(Exception e)
{
APIResult<string> apiResult = new APIResult<string>()
{
StatusCode = StatusCode.UnexpectedError
};
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ObjectContent<APIResult<string>>(apiResult, new JsonMediaTypeFormatter())
};
var tsc = new TaskCompletionSource<HttpResponseMessage>();
tsc.SetResult(response); Trace.WriteLine(e.Message); return tsc.Task;
} return result;
}
}
WebApiのエラーメッセージをどうカスタマイズです?的更多相关文章
- 20、ASP.NET MVC入门到精通——WebAPI
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 微软有了Webservice和WCF,为什么还要有WebAPI? 用过WCF的人应该都清楚,面对那一大堆复杂的配置文件,有时候一出问题,真的 ...
- MVC—WebAPI(调用、授权)
ASP.NET MVC—WebAPI(调用.授权) 本系列目录:ASP.NET MVC4入门到精通系列目录汇总 微软有了Webservice和WCF,为什么还要有WebAPI? 用过WCF的人应该 ...
- WebApi系列(从.Net FrameWork 到 .Net Core)
一. 简介 1. 什么是WebApi? WebApi是一个很广泛的概念,在这里我们特指.Net平台下的Asp.Net WebApi框架,它是针对各种客户端(浏览器.APP等)来构建Http服务的一个 ...
- 【WebAPI】从零开始学会使用.NET Core WebAPI
介绍 以后会慢慢总结在项目使用中或者学习到的webAPI相关的知识,在这里做记录. 我会从最开始的如何创建WebAPI项目到项目的后续知识一点一点的开始讲述记录. 通过简单有效的方式,让我们能够快速的 ...
- ASP.NET WebApi技术从入门到实战演练
一.课程介绍 曾经有一位不知名的讲师说过这么一句名言: 一门RPC技术不会,那么千万万门RPC技术将都不会!在今天移动互联网的时代,作为攻城师的我们,谁不想着只写一套API就可以让我们的Web, An ...
- c# 进阶之 WebAPI
REST是设计风格而不是标准. webapi有自己的路由. webservice和wcf的协议都是soap协议,数据的序列化和反序列化都是soap的格式.而webapi是Json的数据传递 webap ...
- WebAPI学习日记一:Ajax请求传递参数遇到的问题
首先,本人大学刚毕业,想把自己学习的一些东西记录下来,也是和大家分享,如有不对之处还请多加指正.声明:但凡是我博客里的文章均是本人实际操作遇到的例子,不会随便从网上拷贝或者转载,本着对自己和观众负责的 ...
- 分布式技术 webapi
webapi可以返回json.xml类型的数据,对于数据的增.删.改.成,提供对应的资源操作,按照请求的类型进行相应的处理,主要包括 Get(查).Post(增).Put(改).Delete(删),这 ...
- WebApi 实例
REST是设计风格而不是标准. webapi有自己的路由. webservice和wcf的协议都是soap协议,数据的序列化和反序列化都是soap的格式.而webapi是Json的数据传递 webap ...
随机推荐
- Word撤销键(Ctrl+z)无效的解决方法
最近翻译一本新书,Word2013用的较多,于是发现了一个奇怪的问题,撤销按钮一直是灰色.编辑的时候闪一下,又变为灰色.按Ctrl-Z也同样不管用.中文资源里面的解决方法都是用winword.exe ...
- 本科小白学ROS 和 SLAM(一):杂谈
本人最近才迷恋上ROS(Robot Operating System),准确的说应该是6月中旬,具体的记不清了(可能是年纪大了,容易健忘).对于一个电子DIY的狂热爱好者来说,我在校的梦想就是做一个属 ...
- JavaScript深入浅出2-表达式和运算符
慕课网教程视频地址:Javascript深入浅出 表达式是指能计算出值的任何可用程序单元 原始表达式:常量.直接量 3.14,“test” 关键字 null,this 变量 i,k,j 表达式含:原始 ...
- linux shell脚本常用语句
linux shell 指令 诸如-d, -f, -e之类的判断表达式: 文件比较运算符-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]-d ...
- linux下安装使用libuuid(uuid-generate)
linux下安装使用libuuid(uuid-generate) linux下安装使用libuuid(uuid-generate) UUID简介 安装libuuid库 编写一个程序试一下 代码 编译运 ...
- SVN钩子说明
post-commit在提交完成,成功创建版本之后执行该钩子,提交已经完成,不可更改,因此本脚本的返回值被忽略. post-lock对文件进行加锁操作之后执行该脚本 post-revprop-chan ...
- php在centos下的脚本没有解析的问题
如题,参考了许多,比如:http://serverfault.com/questions/523131/php5-is-installed-but-apache-is-displaying-php-a ...
- 3分钟,9个Q&A让你快速知道Docker到底是什么
不论是Google.Amazon.Microsoft.VMware都纷纷拥戴,加入Docker和Container所掀起的新时代云端虚拟化行列,这两项技术成为了IT界的新趋势.Docker和Conta ...
- C# 数组、多维数组(矩形数组)、锯齿数组(交叉数组)
数组是变量的索引列表,可以在方括号中指定索引来访问数组中的各个成员,其中索引是一个整数,从0开始. 一维数组 多维数组(矩形数组) 数组的数组(锯齿数组) 数组必须在访问之前初始化,数组的初始化有两种 ...
- ADO.NET中的五个主要对象
Connection:主要是开启程序和数据库之间的连接.没有利用连接对象将数据库打开,是无法从数据库中取得数据的.Close和Dispose的区别,Close以后还可以Open,Dispose以后则不 ...