Pagine di aiuto generate automaticamente con tipo di ritorno HttpResponseMessage

Gradirei qualche chiarimento sulle pagine di aiuto generate da Web api.

Per quanto ho potuto capire, se restituisco un Type, genererà automaticamente la pagina di aiuto per quell’azione con un esempio. Ma se utilizzo HttpResponseMessage è comprensibile che non possa indovinare quale sarà la risposta e non può fare ipotesi sui parametri della richiesta.

Il motivo per cui stavo utilizzando HttpResponseMessage era perché si consigliava di indicare il codice di stato che si desidera restituire quando potrebbe essere diverso da 200.

Quindi qual è l’approccio migliore per essere in grado di restituire i codici di stato desiderati, ma avere ancora le pagine di aiuto che elaborano i tipi che stai restituendo?

Per questi scenari in cui è necessario restituire HttpResponseMessage, la soluzione alternativa è indicare il tipo effettivo di ritorno di quella particolare azione utilizzando alcuni degli helper forniti da HelpPage. È ansible trovare il seguente codice nel percorso Areas\HelpPage\App_Start\HelpPageConfig.cs

 //// Uncomment the following to correct the sample response when the action returns an HttpResponseMessage with ObjectContent. //// 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"); 

Nota :
Nel prossimo rilascio stiamo introducendo un nuovo attributo chiamato System.Web.Http.Description.ResponseTypeAttribute al quale è ansible fornire un System.Type indica il tipo effettivo della risposta. In questo modo puoi restituire HttpResponseMessage o IHttpActionResult dalla tua azione e aspettare che HelpPage funzioni.

MVC 5 ha un attributo incorporato per impostare il tipo di risposta.

Maggiori informazioni qui: http://thesoftwaredudeblog.wordpress.com/2014/01/05/webapi-2-helppage-using-responsetype-attribute-instead-of-setactualresponsetype/

Basta usare:

  ResponseType(typeof([Your_Class]))] 

Penso che l’Attributo sia una grande idea e quindi ho implementato un attributo che potrebbe aiutare gli altri fino a quando non lo pubblicherete.

Decora le tue azioni con l’attributo:

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

Definisci l’attributo:

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

Definire il metodo per registrare i tipi di risposta:

 ///  /// Registers api controller actions which return HttpResponseMessage /// and include the ResponseType attribute to be populated with web api /// auto generated help. ///  /// The assembly to search for 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); } } } 

Includilo all’avvio dell’applicazione:

 RegisterHelpResponseTypes(typeof(FooController).Assembly); 

Per favore fatemi sapere se trovate qualche problema.