2016-09-29 90 views
1

我试图在响应头文件中传递自定义Http状态代码时,使用Asp.Net锅炉板动态API和通过继承AbpApiController编写的web api。在DynamicAPI和/或AbpApiController中添加HTTP状态代码

以下是两种方法我试过,但没有成功 一)在AppService服务,我用

public async Task<HttpResponseMessage> GetData() 
{ 
    HttpResponseMessage response=new HttpResponseMessage(); 
    response.Headers.Add("Status", "201"); 
    return response; 
} 

B)我的另一种方法是写一个继承AbpApiController的ApiController。并且,我写了

public IHttpActionResult GetData() 
{ 
    var data=null; 
    return NotFoundResult(data); 
} 

这两种方法都失败了。我们如何实现这一点?

在此先感谢:-)

=======

而且,怎么可能实现HostAuthenticationFilter( “载体”)为AbpApiController?

回答

0

这是我在遇到同样问题时提出的解决方法。与ABP相比,解决方案与ASP.NET更相关。

首先,我在我的基本异常中创建了错误代码的字段。

事情是这样的:

public class BaseException : Exception 
{ 
    public int ErrorCode { get; private set; } 
    public BaseException() : this(500) 
    { 

    } 
    public BaseException(int errorCode) 
    { 
     ErrorCode = errorCode; 
    } 
    public BaseException(int errorCode, string message) : base(message) 
    { 
     ErrorCode = errorCode; 
    } 
} 

然后我介绍下,承认我的BaseException异常和读取错误代码修改的异常过滤器:

namespace Abp.WebApi.ExceptionHandling 
{ 
    /// <summary> 
    /// Used to handle exceptions on web api controllers. 
    /// </summary> 
    public class CustomApiExceptionFilter : ExceptionFilterAttribute, ITransientDependency 
    { 
     /// <summary> 
     /// Reference to the <see cref="ILogger"/>. 
     /// </summary> 
     public ILogger Logger { get; set; } 

     /// <summary> 
     /// Reference to the <see cref="IEventBus"/>. 
     /// </summary> 
     public IEventBus EventBus { get; set; } 

     public IAbpSession AbpSession { get; set; } 

     private readonly IAbpWebApiModuleConfiguration _configuration; 

     /// <summary> 
     /// Initializes a new instance of the <see cref="AbpApiExceptionFilterAttribute"/> class. 
     /// </summary> 
     public CustomApiExceptionFilter(IAbpWebApiModuleConfiguration configuration) 
     {    
      _configuration = configuration; 
      Logger = NullLogger.Instance; 
      EventBus = NullEventBus.Instance; 
      AbpSession = NullAbpSession.Instance; 
     } 

     /// <summary> 
     /// Raises the exception event. 
     /// </summary> 
     /// <param name="context">The context for the action.</param> 
     public override void OnException(HttpActionExecutedContext context) 
     { 
      var wrapResultAttribute = (context.ActionContext.ActionDescriptor) 
        .GetWrapResultAttributeOrNull(); 
      // ?? _configuration.DefaultWrapResultAttribute; 

      if (wrapResultAttribute == null || wrapResultAttribute.LogError) 
      { 
       LogHelper.LogException(Logger, context.Exception); 
      } 

      if (wrapResultAttribute == null || wrapResultAttribute.WrapOnError) 
      { 
       context.Response = context.Request.CreateResponse(
        GetStatusCode(context), 
        new AjaxResponse(
         SingletonDependency<ErrorInfoBuilder>.Instance.BuildForException(context.Exception), 
         context.Exception is Abp.Authorization.AbpAuthorizationException) 
        ); 


       EventBus.Trigger(this, new AbpHandledExceptionData(context.Exception)); 
      } 
     } 

     private HttpStatusCode GetStatusCode(HttpActionExecutedContext context) 
     { 
      if (context.Exception is Abp.Authorization.AbpAuthorizationException) 
      { 
       return AbpSession.UserId.HasValue 
        ? HttpStatusCode.Forbidden 
        : HttpStatusCode.Unauthorized; 
      } 

      var customException = (context.Exception as BaseException); 
      if (customException != null) 
       return 
        (HttpStatusCode)customException.ErrorCode; 

      return 
       HttpStatusCode.InternalServerError; 
     } 
    } 
} 

最后,更换 ABP自动注册在WebApiModule初始化中用我的实现过滤。

public MyWebApiModule : AbpModule 
{ 
    public override void Initialize() 
    { 
     // ... 

     var filters = Configuration.Modules.AbpWebApi().HttpConfiguration.Filters; 

     var exceptionFilter = filters.First(h => h.Instance is AbpExceptionFilterAttribute).Instance; 
     filters.Remove(exceptionFilter); 
     filters.Add(IocManager.Resolve<CustomApiExceptionFilter>()); 
    } 
} 

现在通过我的自定义例外和过滤器,我可以控制响应状态码。