我已成功将web api controller
添加到现有的MVC4
应用程序中。
我希望获得新的web api示例(ex. http://sample.hostname.com/help)
中提供的api文档功能。我相信这些使用ApiExplorer
类。我尝试将HelpPage
区域复制到我的项目中,但是我收到错误
“无法构造String类型。您必须配置容器以提供此值”
当我尝试导航到帮助时。
我必须做些什么来添加API的自动文档?
答案 0 :(得分:7)
正如其他人已经说过的那样,您必须先安装NuGet包Microsoft.AspNet.WebApi.HelpPage
。这将在您的应用程序中创建一个新的HelpPage区域,其中包含显示文档所需的视图,模型和控制器。
但是,生成的HelpController包含重载的构造函数:
public HelpController(HttpConfiguration config)
{
Configuration = config;
}
这似乎不适合Unity(或者可能是任何类型的DI容器)。你收到这个错误:
[InvalidOperationException: The type String cannot be constructed. You must configure the container to supply this value.]
删除此重载,它应该可以正常工作。
还发现了另一个对此的引用: http://www.stefan-scheller.com/2013/08/the-type-string-cannot-be-constructed-web-api-with-unity/
答案 1 :(得分:5)
V5.2.2具有以下代码:
public HelpController()
: this(GlobalConfiguration.Configuration)
{
}
public HelpController(HttpConfiguration config)
{
Configuration = config;
}
HelpController中的
Unity使用具有最多参数的构造函数,因此要使其使用无参数构造函数,我将第二个重载更改为protected:
protected HelpController(HttpConfiguration config)
{
Configuration = config;
}
帮助页面又回来了
答案 2 :(得分:4)
我的假设是要求是为Web API端点而不是MVC端点提供自动化文档。基于这个假设,我建立了一个按预期工作的POC,如果需要,我总是可以给你发邮件:)。
构建新的MVC 4 Internet应用程序。这将生成主页和帐户控制器,匹配视图和MVC路由。
通过在程序包管理器的“在线”部分中搜索“HelpPage”,在Microsoft.AspNet.WebApi.HelpPage程序包中添加。
为Web API控制器添加一个名为“Api”的新文件夹。这是由WebApiConfig.cs的Register方法中设置的WebApi路由驱动的。我的如下:
public static void Register(HttpConfiguration
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
}
构建项目。命中端点/帮助。它吐出了我的api控制器中的所有端点(一个get和一个post端点)。
这不需要对通过添加HelpPages包生成的区域文件夹进行任何更改。所需要的只是在文件夹中添加一个新的Api文件夹和一个新的Api控制器(空),并在新控制器中内置一个快速的两个端点。
答案 3 :(得分:3)
我之前可以确认答案 - 如果控制器匹配路由并从ApiController继承,HelpPage会检测到任何控制器,无论它位于何处。
我花了好几个小时打猎这个。我想,它必须是我添加到项目中的东西,这弄乱了我的路线/ API。所以我在安装/卸载各种Nuget软件包几个小时后发现了它。我的项目的问题是我安装了Glimpse.Mvc4包。这个包以某种方式阻止了ApiExplorer拿起我的API。这显然是Glimpse.Mvc4(或Glimpse.AspNet)软件包中的一个错误或ApiExporer中的一个错误(我没有发现错误是什么)。
我会向Glimpse团队报告。在这里发布这个答案可能也会帮助其他人。
答案 4 :(得分:2)
答案 5 :(得分:1)
查看Yao关于帮助页面的博客:
答案 6 :(得分:0)
我刚遇到这个问题。这就是我的意思。
我已经将帮助页面用于以前的项目(w / MVC 5和Web API 2),所以我知道在我的新项目中它有所不同。在旧的(工作)项目中,我只在WebApi控制器中进行DI,而不是MVC控制器。我在MVC控制器中不需要DI,因此我只是将代码引导UnityDependencyResolver作为MVC依赖解析器(在我的例子中是UnityMvcActivator类)。
显然,这对所有人来说都不是一个选择,但如果没有,@ Adrian Brown的答案看起来是你最好的选择,直到这个问题得到解决。