2013-07-23 14 views
15

Byłbym wdzięczny za wyjaśnienia na temat stron pomocy generowanych automatycznie przez web api.Automatycznie generowane strony pomocy z typem powrotu HttpResponseMessage

O ile rozumiem, jeśli zwrócę typ, automatycznie wygeneruje stronę pomocy dla tego działania na przykładzie. Ale jeśli używam HttpResponseMessage, to jest zrozumiałe, że nie może odgadnąć, jaka będzie odpowiedź, i może jedynie przyjąć założenia dotyczące parametrów żądania.

Powodem używałem HttpResponseMessage ponieważ był polecany do wskazania kodu statusu chcesz wrócić, kiedy może to być inny niż 200.

So co to podejście najlepsze praktyki, aby móc powrócić pożądane kody statusu, ale nadal masz strony pomocy na temat typów, które powracasz?

+0

należy zdefiniować kody stanu wyjątki, które różnią się od tego, co się spodziewać. W aplikacji Restful rozmówcy Twojego API oczekują "200 OK", chyba że wystąpi jakiś błąd. –

+0

@ CharlieBrown: Lub inne kody 2xx, na przykład 201 utworzone. http://pl.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_Success – SLaks

+0

@SLaks dokładnie dlatego właśnie byłbym wdzięczny za twoją radę na ten temat –

Odpowiedz

18

W przypadku tych scenariuszy, w których należy zwrócić komunikat HttpResponseMessage, obejście to wskazuje rzeczywisty typ zwracania tej konkretnej czynności za pomocą niektórych pomocników udostępnianych przez pomoc. można znaleźć następujący kod w ścieżce 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"); 

Uwaga:
W nadchodzącym wydaniu wprowadzamy nowy atrybut o nazwie System.Web.Http.Description.ResponseTypeAttriute do których można dostarczać System.Type wskazujący rzeczywistą typ odpowiedzi . W ten sposób możesz zwrócić HttpResponseMessage lub IHttpActionResult ze swojej akcji i nadal oczekiwać działania HelpPage.

+1

"System.Web.Http.Description.ResponseTypeAttribute" jest dostępny w Web API 2.1, więc polecam używanie tego podejścia. – Bishbulb

+0

OK, ale to nadal dokumentuje jeden rodzaj odpowiedzi. Mam akcję PUT, która może powrócić 204, 202 lub 400. Dwa ostatnie mają jednostkę odpowiedzi –

7

Myślę, że atrybut jest świetnym pomysłem i dlatego zaimplementowałem atrybut, który może pomóc innym, dopóki go nie wypuścicie.

Udekoruj swoje działania z atrybutem:

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

Definiowanie atrybutu:

[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; } 
} 

zdefiniować metodę zarejestrować typy reakcji:

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

umieścić go na swojej aplikacji początek:

RegisterHelpResponseTypes(typeof(FooController).Assembly); 

Proszę dać mi znać, jeśli znajdziesz jakieś problemy.

+0

Czy możesz podać przykład użycia? Dodałem wszystkie powyższe, ale nie widzę żadnej dokumentacji dla mojego typu zwrotu. – mayabelle

+0

Co dokładnie masz, kiedy wchodzisz na strony pomocy WebAPI i przechodzisz do kontrolera/akcji, gdzie udekorowałeś atrybutem? –

+0

Po dodaniu implementacji atrybutu widzę przykładową odpowiedź działającą poprawnie. Ale ja naprawdę chcę zobaczyć komentarze XML dla właściwości na złożonym obiekcie (który jest w treści HttpResponseMessage). Czy istnieje sposób, aby to zrobić za pomocą tego atrybutu? Zamieściłem wyjaśnienie tego, co próbuję zrobić tutaj: http://stackoverflow.com/questions/19646987/webapi-help-page-documentation-for-return-lub-parameter-model-class-properties – mayabelle

Powiązane problemy