Автоматически создаваемые страницы справки с возвращаемым типом 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);
Пожалуйста, дайте мне знать, если вы найдете какие-либо проблемы.
Ответ 3
MVC 5 имеет встроенный атрибут для установки типа ответа.
Дополнительная информация здесь:
http://thesoftwaredudeblog.wordpress.com/2014/01/05/webapi-2-helppage-using-responsetype-attribute-instead-of-setactualresponsetype/
Просто используйте:
ResponseType(typeof([Your_Class]))]