Страницы справки Web API и API Explorer возвращают 0 описаний
У меня есть этот проект, который просто проект веб-API. В какой-то момент в прошлом я удалил HelpPages и заставил приложение использовать OWIN. Теперь меня попросили добавить API HelpPages обратно, в котором я это сделал. Я установил мой класс запуска так, чтобы он выглядел примерно так:
public void Configuration(IAppBuilder app)
{
// Needs to be first
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
var httpConfig = new HttpConfiguration();
// Register all areas
AreaRegistration.RegisterAllAreas();
ConfigureOAuthTokenGeneration(app);
ConfigureOAuthTokenConsumption(app);
ConfigureWebApi(httpConfig);
app.UseWebApi(httpConfig);
}
Так что мой маршрут для страниц справки работает. Насколько я могу судить, это должно сработать, но проблема в том, что ApiExplorer не возвращает никаких описаний.
В моем методе ConfigureWebApi я удаляю форматирование, я это закомментировал, но он все еще не работает, вот метод:
private void ConfigureWebApi(HttpConfiguration config)
{
// Web API configuration and services
var formatters = config.Formatters;
var jsonFormatter = formatters.JsonFormatter;
var serializerSettings = jsonFormatter.SerializerSettings;
// Remove XML formatting
formatters.Remove(config.Formatters.XmlFormatter);
jsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
jsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
// Configure our JSON output
serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
serializerSettings.Formatting = Formatting.Indented;
serializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
serializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None;
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
Я на самом деле отредактировал HelpController и поместил точку останова в строку возврата, как я знаю, у ApiExplorer нет описаний:
public ActionResult Index()
{
var docProdivder = Configuration.Services.GetDocumentationProvider();
var desciptions = Configuration.Services.GetApiExplorer().ApiDescriptions;
ViewBag.DocumentationProvider = docProdivder;
return View(desciptions);
}
Я где-то читал, что если я сделаю это:
public void Configuration(IAppBuilder app)
{
// Needs to be first
app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
// For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
var httpConfig = new HttpConfiguration();
var exploerer = new ApiExplorer(httpConfig);
var descriptions = exploerer.ApiDescriptions;
// Register all areas
AreaRegistration.RegisterAllAreas();
ConfigureOAuthTokenGeneration(app);
ConfigureOAuthTokenConsumption(app);
ConfigureWebApi(httpConfig);
app.UseWebApi(httpConfig);
}
Я должен видеть описания, но это все еще не работает. Затем я читаю где-то еще, чтобы настроить мой проект для вывода файла описания xml и настроить файл HelpPageConfig для использования documentProvider. Я сгенерировал файл описания Xml и могу убедиться, что мои описания там, вот фрагмент:
<member name="T:Melanite.Controllers.CollectionsController">
<summary>
Controller for all collection related functions
</summary>
</member>
<member name="M:Melanite.Controllers.CollectionsController.#ctor">
<summary>
Default constructor
</summary>
</member>
<member name="M:Melanite.Controllers.CollectionsController.Get(System.Int32)">
<summary>
Get all the collections for the given center
</summary>
<param name="centerId">The id of the center that the collection belongs to</param>
<returns>A list of collections</returns>
</member>
<member name="M:Melanite.Controllers.CollectionsController.Get(System.Int32,System.DateTime)">
<summary>
Get all the collections for the given center on a specific date
</summary>
<param name="centerId">The id of the center that the collection belongs to</param>
<param name="date">The planned collection date for the collections</param>
<returns>A list of collections</returns>
</member>
Я раскомментировал строки в HelpPageConfig следующим образом:
// Uncomment the following to use the documentation from XML documentation file.
config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));
и убедился, что файл XML находится в папке App_Data. Все имена правильные, но когда я запускаю свой проект, я все равно не получаю описания от ApiExplorer.
Итак, как вы можете видеть, я нахожусь в конце моего ума. Я надеюсь, что кто-то сталкивался с этим раньше и знает, как это исправить. Если да, пожалуйста, помогите!
2 ответа
У меня та же проблема. Если бы я добавил
GlobalConfiguration.Configure(WebApiConfig.Register)
в классе запуска (я не использую global.asax) все работало правильно. Я надеюсь, что это поможет вам тоже.
Если у вас нет доступа к WebApiConfig.Register, которого у меня не было в моем проекте Owin WebApi, мне кажется, что следующий код мне подходит.
GlobalConfiguration.Configure((config) => { config.MapHttpAttributeRoutes(); });