2015-10-15 63 views
0

我想編寫Web API進行應用程序開發人員,我要像下面如何處理,我在asp.net網頁API想要的結果

當異常樣本的API結果:

{ 
    "StatusCode": "0", 
    "Message": "There's exception when calling web api" 
} 

正常:json字符串中的結果是web api操作中的返回類型。

{ 
    "StatusCode": "1", 
    "Message": "Action completed successful", 
    "Result": {} 
} 

如果操作爲:

public DemoController : ApiController 
{ 
    public class DemoModel 
    { 
     public string X {get;set;} 
     public int Y {get;set;} 
    } 

    [HttpGet] 
    public DemoModel GetModel(int id) 
    { 
     return new DemoModel() { X = "Demo return string" , Y = 1234}; 
    } 
} 

JSON字符串應該是成功地調用動作時,下面的示例。

{ 
    "StatusCode": "1", 
    "Message": "Action completed successful", 
    "Result": { 
     "X": "Demo return string", 
     "Y": 1234 
    } 
} 

,當異常,應該是:

{ 
    "StatusCode": "0", 
    "Message": "There's exception when calling web api" 
} 

因此,應用程序開發人員可以在web API幫助頁面的返回類型的詳細信息。

那是容易實現的?以及如何做(沒有細節,只是邏輯,還詳細越好。)

感謝大家!

+0

返回該對象作爲結果'return this.Ok(yourObject);' – Fabio

+0

@Fabio然後返回類型不匹配方法聲明,對吧?那麼什麼是合適的返回類型? – mason

+0

返回類型將IHttpActionResult和客戶端'Result'值可以基於'StatusCode'使用 – Fabio

回答

0

應該創建DelegatingHandler爲包裝你從服務器的所有響應:

public class WrappingResponseHandler : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, 
                   CancellationToken cancellationToken) 
    { 
     HttpResponseMessage response = await base.SendAsync(request, cancellationToken); 

     return BuildApiResponse(request, response); 
    } 

    private static HttpResponseMessage BuildApiResponse(HttpRequestMessage request, HttpResponseMessage response) 
    { 
     object result; 
     string message = null; 
     int status; 
     if (response.TryGetContentValue(out result) == false || response.IsSuccessStatusCode == false) 
     { 

      var error = result as HttpError; 
      if (error != null) 
      { 
       result = null; 
      } 

      message = "There's exception when calling web api"; 
      status = 0; 
     } 
     else 
     { 
      message = "Action completed successful"; 
      status = 1; 
     } 

     HttpResponseMessage newResponse = request.CreateResponse(response.StatusCode, 
      new ApiResponse() { Message = message, Result = result, StatusCode = status }); 

     foreach (KeyValuePair<string, IEnumerable<string>> header in response.Headers) 
     { 
      newResponse.Headers.Add(header.Key, header.Value); 
     } 

     return newResponse; 
    } 

    public class ApiResponse 
    { 
     public int StatusCode { get; set; } 
     public string Message { get; set; } 
     public object Result { get; set; } 
    } 
} 

而且在WebApiConfig添加此處理程序:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.MessageHandlers.Add(new WrappingResponseHandler()); //here 

     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

而且什麼事都不會改變,並添加了控制器。

+0

它適合我,非常感謝你。 –

+0

如果我的回答很有幫助,請將其標爲正確 –

0

使用IHttpActionResult將真正有幫助,尤其是如果你對應用程序開發人員的想法。它的工作原理非常具有像200(OK)等

下面是簡單的代碼示例,其中基於回報你獲得的產品,並返回相應的響應HTTP響應代碼,500(內部服務器錯誤),404(未找到)

public IHttpActionResult Get (int id) 
{ 
    Product product = _repository.Get (id); 
    if (product == null) 
    { 
     return NotFound(); // Returns a NotFoundResult 
    } 
    return Ok(product); // Returns an OkNegotiatedContentResult 
} 

有關此Action Results on Web Api 2的更多內容,您甚至可以編寫自定義操作結果。

當應用程序客戶端消耗時,它會得到正確的HTTP響應代碼,任何響應對象或消息。