2013-07-23 21 views
15

Tôi sẽ đánh giá cao một số giải thích về trang trợ giúp tự động tạo trang web api.Trang trợ giúp được tạo tự động với kiểu trả về HttpResponseMessage

Theo như tôi có thể hiểu, nếu tôi trả về Loại, nó sẽ tự động tạo trang trợ giúp cho hành động đó bằng một ví dụ. Nhưng nếu tôi sử dụng HttpResponseMessage thì dễ hiểu là nó không thể đoán được phản hồi sẽ là gì và chỉ có thể đưa ra các giả định về các tham số yêu cầu.

Lý do tôi đã sử dụng HttpResponseMessage được vì nó đã được đề nghị để chỉ ra mã trạng thái mà bạn muốn quay trở lại khi nó có thể khác với 200.

Vì vậy phương pháp thực hành tốt nhất là những gì để có thể trở lại mã trạng thái mong muốn của bạn, nhưng vẫn có các trang trợ giúp làm việc ra các loại bạn đang quay trở lại?

+0

Bạn nên xác định mã trạng thái cho trường hợp ngoại lệ khác với những gì được mong đợi. Trong ứng dụng Restful, người gọi API của bạn sẽ mong đợi '200 OK' trừ khi có lỗi xảy ra. –

+0

@CharlieBrown: Hoặc các mã 2xx khác, chẳng hạn như 201 Tạo. http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_Success – SLaks

+0

@SLaks chính xác đó là lý do tại sao tôi sẽ đánh giá cao lời khuyên của bạn về điều này –

Trả lời

18

Đối với các trường hợp này, nơi bạn cần trả về HttpResponseMessage, giải pháp thay thế là chỉ ra loại trả về thực tế của hành động cụ thể đó bằng cách sử dụng một số trợ giúp mà HelpPage cung cấp. Bạn có thể tìm đoạn mã sau trong đường dẫn Areas\HelpPage\App_Start\HelpPageConfig.cs

//// Uncomment the following to correct the sample response when the action returns an HttpResponseMessage with ObjectContent<string>. 
//// The sample will be generated as if the controller named "Values" and action named "Post" were returning a string. 
//config.SetActualResponseType(typeof(string), "Values", "Post"); 

Note:
Trong phiên tới, chúng tôi đang giới thiệu một thuộc tính mới gọi là System.Web.Http.Description.ResponseTypeAttriute mà bạn có thể cung cấp một System.Type cho thấy các loại thực tế của phản ứng . Bằng cách này, bạn có thể trả lại HttpResponseMessage hoặc IHttpActionResult từ hành động của mình và vẫn mong đợi HelpPage hoạt động.

+1

'System.Web.Http.Description.ResponseTypeAttribute' có sẵn trong API Web 2.1, vì vậy tôi khuyên bạn nên sử dụng phương pháp đó. – Bishbulb

+0

Ok, nhưng vẫn ghi lại một loại phản hồi. Tôi có một hành động PUT có thể trả về 204, 202 hoặc 400. Hai hành động sau có nội dung phản hồi –

7

Tôi nghĩ Thuộc tính là một ý tưởng tuyệt vời và vì vậy tôi đã triển khai thuộc tính có thể giúp người khác cho đến khi các bạn phát hành nó.

Trang trí hành động của bạn với các thuộc tính:

public class FooController : ApiController 
{ 
    [ResponseType(typeof(Bar))] 
    public HttpResponseMessage Get(string id) 
    { 
     // ... 
    } 
} 

Xác định các thuộc tính:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] 
public class ResponseTypeAttribute : Attribute 
{ 
    public ResponseTypeAttribute(Type type) 
    { 
     if (type == null) 
     { 
      throw new ArgumentNullException("type"); 
     } 

     Type = type; 
    } 

    public Type Type { get; private set; } 
} 

Xác định phương pháp để đăng ký các loại phản ứng:

/// <summary> 
///  Registers api controller actions which return HttpResponseMessage 
///  and include the ResponseType attribute to be populated with web api 
///  auto generated help. 
/// </summary> 
/// <param name="assembly">The assembly to search for</param> 
public static void RegisterHelpResponseTypes(Assembly assembly) 
{ 
    var apiControllerTypes = assembly 
     .GetTypes().Where(typeof(ApiController).IsAssignableFrom); 

    foreach (var apiControllerType in apiControllerTypes) 
    { 
     var validActions = apiControllerType.GetMethods() 
      .Where(method => 
       Attribute.IsDefined(method, typeof(ResponseTypeAttribute)) 
       && 
       (method.ReturnType == typeof(HttpResponseMessage))); 

     foreach (var action in validActions) 
     { 
      var responseType = (ResponseTypeAttribute)Attribute 
            .GetCustomAttributes(action) 
            .Single(x => x is ResponseTypeAttribute); 

      var controllerName = apiControllerType.Name.Substring(0, 
        apiControllerType.Name.LastIndexOf("Controller", 
             StringComparison.OrdinalIgnoreCase)); 
      var actionName = action.Name; 

      GlobalConfiguration 
       .Configuration 
       .SetActualResponseType(responseType.Type, 
             controllerName, 
             actionName); 
     } 
    } 
} 

Bao gồm nó trên ứng dụng của bạn bắt đầu:

RegisterHelpResponseTypes(typeof(FooController).Assembly); 

Vui lòng cho tôi biết nếu bạn tìm thấy bất kỳ vấn đề nào.

+0

Bạn có thể cung cấp ví dụ về cách sử dụng không? Tôi đã thêm tất cả những điều trên nhưng không thấy bất kỳ tài liệu nào cho loại trả lại của tôi. – mayabelle

+0

Chính xác những gì bạn đang có khi bạn điều hướng đến các trang trợ giúp của WebAPI và đi đến bộ điều khiển/hành động mà bạn đã trang trí với thuộc tính? –

+0

Sau khi thêm cài đặt thuộc tính của bạn, tôi thấy phản hồi mẫu hoạt động chính xác. Nhưng điều tôi thực sự muốn là xem các chú thích XML cho các thuộc tính trên đối tượng phức tạp (mà là trong phần thân của HttpResponseMessage). Có cách nào để làm điều đó bằng cách sử dụng thuộc tính này? Tôi đã đăng một lời giải thích về những gì tôi đang cố gắng làm ở đây: http://stackoverflow.com/questions/19646987/webapi-help-page-documentation-for-return-or-parameter-model-class-properties – mayabelle

Các vấn đề liên quan