Автоматически создаваемые страницы справки с возвращаемым типом HttpResponseMessage

Я был бы признателен за некоторые разъяснения в отношении страниц, созданных с помощью веб-api auto.

Насколько я понял, если я верну Тип, он автоматически создаст страницу справки для этого действия с примером. Но если я использую HttpResponseMessage, чем понятно, что он не может догадаться, каким будет ответ, и может делать предположения только по параметрам запроса.

Причина, по которой я использовал HttpResponseMessage, состояла в том, что было рекомендовано указать код состояния, который вы хотите вернуть, когда он может отличаться от 200.

Итак, , что подход наилучшей практики сможет вернуть желаемые коды состояния, но все же есть страницы справки, в которых вы будете обрабатывать типы, которые вы возвращаете?

Ответы

Ответ 1

Для этих сценариев, где вам нужно будет возвратить HttpResponseMessage, обходным путем является указание фактического типа возврата этого конкретного действия с использованием некоторых помощников, которые предоставляет HelpPage. Вы можете найти следующий код на пути 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");

Примечание:
В следующем выпуске мы вводим новый атрибут System.Web.Http.Description.ResponseTypeAttriute, к которому вы можете указать System.Type, указывающий фактический тип ответа. Таким образом вы можете вернуть HttpResponseMessage или IHttpActionResult из своего действия и по-прежнему ожидать, что HelpPage будет работать.

Ответ 2

Я думаю, что атрибут - отличная идея, поэтому я применил атрибут, который может помочь другим, пока вы, ребята, не выпустите его.

Украсьте свои действия атрибутом:

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

Определите атрибут:

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

Определите метод регистрации типов ответов:

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

Включите его в начало приложения:

RegisterHelpResponseTypes(typeof(FooController).Assembly);

Пожалуйста, дайте мне знать, если вы найдете какие-либо проблемы.