2016-03-05 110 views
1

在我的api控制器操作方法中。我正在使用內容協商獲取請求。代碼:重寫ExecuteAsync方法以避免重複Web Api操作的代碼方法

IContentNegotiator negotiator = this.Configuration.Services.GetContentNegotiator(); 
ContentNegotiationResult result = negotiator.Negotiate(typeof(OfficeDetailsDto), this.Request, this.Configuration.Formatters); 
if (result == null) 
{ 
    var responseErr = new HttpResponseMessage(HttpStatusCode.NotAcceptable); 
    throw new HttpResponseException(responseErr); 
} 

但現在我想通過繼承ApiController創建BaseAPIController控制器,並希望重寫基類的方法有上面的代碼,這樣我就不用在我所有的控制器類中一次又一次地寫這些代碼。這也會使我的控制器操作方法變得更簡單。

任何人都可以給我任何建議或樣品請。

回答

1

ApiController已經提供處理內容協商開箱即用的功能,但你可以創建自己的泛型方法(S),你可以從繼承的控制器打電話,如果你真的想自定義內容的談判進程。

BaseAPIController

public abstract class BaseAPIController : ApiController {  
    protected virtual HttpResponseMessage NegotiatedContent<T>(HttpStatusCode statusCode, T content) { 
     var type = typeof(T); 
     var request = this.Request; 
     var formatters = this.Configuration.Formatters; 
     var negotiator = this.Configuration.Services.GetContentNegotiator(); 

     var result = negotiator.Negotiate(type, request, formatters); 
     if (result == null) { 
      var response = new HttpResponseMessage(HttpStatusCode.NotAcceptable); 
      throw new HttpResponseException(response)); 
     } 

     return new HttpResponseMessage() { 
      StatusCode = statusCode, 
      Content = new ObjectContent<T>(
       content,     // What we are serializing 
       result.Formatter,   // The media formatter 
       result.MediaType.MediaType // The MIME type 
      ) 
     }; 
    }  
} 

這個代碼就相當於什麼ApiController自動提供。

潛在OfficeDetailsController與薄得多的動作方法

public class OfficeDetailsController : BaseAPIController {  
    public HttpResponseMessage GetOfficeDetails(int id) { 
     var item = new OfficeDetailsDto() { Id = id, Name = "Gizmo"}; 
     // what ever else needs to be done to the item 
     // ...  
     return NegotiatedContent(HttpStatusCode.Ok, item); 
    } 
} 

這裏是做使用ApiController默認同樣的事情的一個例子。

public class OfficeDetailsController : ApiController {  
    public IHttpActionResult GetOfficeDetails(int id) { 
     var item = new OfficeDetailsDto() { Id = id, Name = "Gizmo"}; 
     // what ever else needs to be done to the item 
     // ...  
     return Ok(item); 
    } 
}