2016-09-29 6 views
1

Asp.NetボイラープレートDynamic APIとAbpApiControllerを継承して作成したWeb APIを使用しているときに、応答ヘッダーにカスタムHttpステータスコードを渡そうとしています。DynamicAPIおよび/またはAbpApiControllerのHttpステータスコードを追加

以下は、私が試した二つの方法であるが、失敗しました: A)AppServiceで、Iは

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

は今私のカスタム例外とフィルターを通して私は、応答ステータスコードを制御することができました。

関連する問題