Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iis 如何覆盖WebAPI中的所有标准错误页_Iis_Error Handling_Asp.net Web Api - Fatal编程技术网

Iis 如何覆盖WebAPI中的所有标准错误页

Iis 如何覆盖WebAPI中的所有标准错误页,iis,error-handling,asp.net-web-api,Iis,Error Handling,Asp.net Web Api,我漂亮的REST Web服务工作得很好。除非我访问像~/这样的页面,它返回默认的IIS 403禁止页面(即使使用Fiddler并仅指定Accept:application/json)。我只需要JSON或XML错误。有没有办法用自定义异常处理程序覆盖所有异常?还是一个默认控制器来处理所有未知请求?什么是最简单、最正确(如果不同的话)的处理方法,以便客户端只需要解析RESTAPI友好的XML数据报或JSON blob 请求示例: GET http://localhost:7414/ HTTP/1.1

我漂亮的REST Web服务工作得很好。除非我访问像
~/
这样的页面,它返回默认的IIS 403禁止页面(即使使用Fiddler并仅指定
Accept:application/json
)。我只需要JSON或XML错误。有没有办法用自定义异常处理程序覆盖所有异常?还是一个默认控制器来处理所有未知请求?什么是最简单、最正确(如果不同的话)的处理方法,以便客户端只需要解析RESTAPI友好的XML数据报或JSON blob

请求示例:

GET http://localhost:7414/ HTTP/1.1
User-Agent: Fiddler
Host: localhost:7414
Accept: application/json, text/json, text/xml
响应:(我不喜欢,注意
text/html
不是公认的响应类型之一)

在IIS管理器中,您可以:

打开IIS管理器并导航到要管理的级别。对于 有关打开IIS管理器的信息,请参阅打开IIS管理器(IIS 7)。 有关在UI中导航到位置的信息,请参阅 在IIS管理器(IIS 7)中导航

在功能视图中,双击错误页面

在“错误页面”页面上,单击以选择要更改的错误

在操作窗格中,单击编辑

在“编辑自定义错误页”对话框中,选择以下选项之一: 如果出现错误,请将静态文件中的内容插入错误响应 内容是静态的,例如.html文件

如果错误内容是动态的,请在此网站上执行URL,例如 一个.asp文件

如果您正在重定向客户端浏览器,请使用302重定向进行响应 到另一个URL

在“文件路径”文本框中,键入自定义错误页的路径(如果有) 将静态文件中的内容插入到选择的错误响应中 路径类型。如果使用,请在此网站上执行URL或响应 对于302重定向路径类型,请改为键入自定义路径的URL 错误页。单击“确定”

另请参见其中的一些屏幕截图

但是,我认为这不会解决响应中的内容类型头——它只是概述了如何更改内容部分,您可以将其更改为JSON格式。我不知道如何在不做更多自定义操作的情况下改变它,但是如果内容仍然是JSON,一些客户机将能够处理错误的内容类型,因此这可能就足够了(如果是这样,可能是您最简单的选择)。所以这不是一个完整的答案,但它可能会帮助你


还有其他更多的代码密集型选项,如自定义HTTP模块或使用服务器端代码/配置(如.Net)处理所有请求并生成正确的响应+头(请参阅或)。

编辑1/26/14:Microsoft刚刚在最新的WebAPI 2.1更新中添加了“”


好的,我想我知道了。它有几个部分

第一:为您的错误创建一个控制器。我根据HTTP错误代码命名了我的操作

公共类错误控制器:ApiController{
[异名]
[ActionName(“Get”)]
公共HttpResponseMessage Get(){
返回请求。CreateErrorInfoResponse(HttpStatusCode.InternalServerError,标题:“未知错误”);
}
[异名]
[行动名称(“404”)]
[HttpGet]
公共HTTPResponseMessageStatus404(){
return Request.CreateErrorInfoResponse(HttpStatusCode.NotFound,description:“没有与指定URL匹配的资源”);
}
[异名]
[行动名称(“400”)]
[HttpGet]
公共HTTPResponseMessageStatus400(){
返回请求.CreateErrorInfoResponse(HttpStatusCode.BadRequest);
}
[异名]
[行动名称(“500”)]
[HttpGet]
公共HTTPResponseMessageStatus500(){
返回请求.CreateErrorInfoResponse(HttpStatusCode.InternalServerError);
}
}
接下来,我创建了一个
genericeExceptionFilterAttribute
,检查HttpActionExecutedContext.Exception是否已填充,以及响应是否仍然为空。如果这两种情况都是真的,那么它将生成一个响应

公共类GenericeExceptionFilterAttribute:ExceptionFilterAttribute{
公共GenericExceptionFilterAttribute()
:base(){
DefaultHandler=(context,ex)=>context.Request.CreateErrorInfoResponse(System.Net.HttpStatusCode.InternalServerError,“内部服务器错误”,“服务器上发生意外错误”,异常:ex);
}
只读字典例外处理程序=新建字典();
public Func DefaultHandler{get;set;}
public void AddExceptionHandler(Func处理程序),其中T:Exception{
Add(typeof(T),handler);
}
public override void OnException(HttpActionExecutedContext上下文){
if(context.Exception==null)返回;
试一试{
var exType=context.Exception.GetType();
if(exceptionHandlers.ContainsKey(exType))
context.Response=exceptionHandlers[exType](context,context.Exception);
if(context.Response==null&&DefaultHandler!=null)
context.Response=DefaultHandler(context,context.Exception);
}
捕获(例外情况除外){
context.Response=context.Request.CreateErrorInfoResponse(HttpStatusCode.InternalServerError,描述:“生成异常响应时出错”,异常:ex);
}
}
}
在我的例子中,我使用了一个通用处理程序,可以注册对每个主要异常类型的支持,并将每个异常类型映射到特定的HTTP响应代码。现在,在
global.asax.cs
中全局注册此筛选器的异常类型和处理程序:

//这些筛选器覆盖默认的ASP.NET异常处理,以创建REST友好的错误响应。
var exceptionFormatter=新的GenericeExceptionFilterAttribute();
exceptionFormatter.AddExceptionHandler((context,ex)=>context.Request.CreateErrorInfoResponse(System.Net.HttpStatusCode.InternalServerError,“未实现”,“此方法尚未实现”
HTTP/1.1 403 Forbidden
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
X-SourceFiles: =?UTF-8?B?QzpcaWNhcm9sXENoYXJpdHlMb2dpYy5pQ2Fyb2wuQXBp?=
X-Powered-By: ASP.NET
Date: Fri, 25 Jan 2013 21:06:21 GMT
Content-Length: 5396

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>IIS 8.0 Detailed Error - 403.14 - Forbidden</title> 
<style type="text/css"> 
<!-- 
...
HTTP/1.1 403 Forbidden
Cache-Control: private
Content-Type: application/json; charset=utf-8
Date: ...
Content-Length: ....

{
  "error":"forbidden",
  "status":403,
  "error_description":"Directory listing not allowed."
}
<system.webServer>
    <httpErrors errorMode="Detailed" />
</system.webServer>