Автоматически сгенерированные страницы справки с возвращаемым типом HttpResponseMessage
Буду признателен за разъяснения о страницах справки, автоматически генерируемых веб-API.
Насколько я мог понять, если я верну Type, он автоматически сгенерирует страницу справки для этого действия с примером. Но если я использую HttpResponseMessage, то понятно, что он не может угадать, каким будет ответ, и может только делать предположения относительно параметров запроса.
Я использовал HttpResponseMessage по той причине, что было рекомендовано указывать код состояния, который вы хотите вернуть, когда он может отличаться от 200.
Итак, каков наилучший практический подход, чтобы иметь возможность вернуть желаемые коды состояния, но при этом все еще есть страницы справки, определяющие типы, которые вы возвращаете?
3 ответа
Для этих сценариев, где вам нужно будет вернуть 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.ResponseTypeAttribute
на который вы можете поставить System.Type
с указанием фактического типа ответа. Таким образом, вы можете вернуться HttpResponseMessage
или же IHttpActionResult
от вашего действия и все еще ожидайте, что HelpPage будет работать.
MVC 5 имеет встроенный атрибут для установки типа ответа.
Более подробная информация здесь: http://thesoftwaredudeblog.wordpress.com/2014/01/05/webapi-2-helppage-using-responsetype-attribute-instead-of-setactualresponsetype/
Просто используйте:
ResponseType(typeof([Your_Class]))]
Я думаю, что Атрибут - отличная идея, и поэтому я реализовал атрибут, который может помочь другим, пока вы, ребята, не выпустите его.
Украсьте свои действия атрибутом:
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);
Пожалуйста, дайте мне знать, если вы обнаружите какие-либо проблемы.