2016-09-29 9 views
1

Asp.Net 보일러 플레이트 동적 API 및 AbpApiController 상속으로 작성된 웹 API를 사용할 때 응답 헤더에 사용자 지정 Http 상태 코드를 전달하려고합니다. 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); 
} 

이 두 가지 방법 모두 실패했습니다. 이것을 어떻게 구현합니까?

======= :-) 사전에

덕분에

또한

, 그것이 어떻게 가능 AbpApiController에 대한 HostAuthenticationFilter ("무기명")을 구현하는 방법?

답변

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>()); 
    } 
} 

이제 내 사용자 지정 예외 및 필터를 통해 응답 상태 코드를 제어 할 수있었습니다.