我已成功将 a 添加web api controller
到现有MVC4
应用程序中。
我想拥有新的 web api 示例中提供的 api 文档功能(ex. http://sample.hostname.com/help)
。我相信这些使用ApiExplorer
类。我尝试将该区域复制HelpPage
到我的项目中,但出现错误
“无法构造字符串类型。您必须配置容器以提供此值”
当我尝试导航以寻求帮助时。
我必须怎么做才能添加 API 的自动化文档?
我已成功将 a 添加web api controller
到现有MVC4
应用程序中。
我想拥有新的 web api 示例中提供的 api 文档功能(ex. http://sample.hostname.com/help)
。我相信这些使用ApiExplorer
类。我尝试将该区域复制HelpPage
到我的项目中,但出现错误
“无法构造字符串类型。您必须配置容器以提供此值”
当我尝试导航以寻求帮助时。
我必须怎么做才能添加 API 的自动化文档?
正如其他人已经说过的,您必须先安装 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/
V5.2.2 有以下代码:
public HelpController()
: this(GlobalConfiguration.Configuration)
{
}
public HelpController(HttpConfiguration config)
{
Configuration = config;
}
在帮助控制器中
Unity 使用具有最多参数的构造函数,因此为了让它使用无参数构造函数,我将第二个重载更改为受保护:
protected HelpController(HttpConfiguration config)
{
Configuration = config;
}
帮助页面又回来了
我的假设是要求为 Web API 端点提供自动化文档,而不是 MVC 端点。基于这个假设,我构建了一个按预期工作的 POC,如果需要,我可以随时通过电子邮件向您发送 zip :)。
构建一个新的 MVC 4 Internet 应用程序。这将生成 Home 和 Account 控制器、匹配视图和 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 控制器(空),并在新控制器中快速构建两个端点。
我之前可以确认答案 - HelpPage 确实会拾取任何控制器,无论它位于何处,如果它匹配路由并继承自 ApiController。
我花了几个小时追捕这个。我想,一定是我添加到项目中的东西弄乱了我的路由/API。所以我在安装/卸载各种 Nuget 包数小时后找到了它。我的项目的问题是我安装了Glimpse.Mvc4包。这个包以某种方式阻止了ApiExplorer获取我的 API。这显然是 Glimpse.Mvc4(或 Glimpse.AspNet)包中的错误或 ApiExporer 中的错误(我没有费力找出错误是什么)。
我会将此事报告给 Glimpse 团队。在此处发布此答案可能也会对其他人有所帮助。
查看 Yao 的关于帮助页面的博客:
我刚遇到这个问题。这对我来说是这样的。
我在以前的项目(使用 MVC 5 和 Web API 2)上有帮助页面,所以我知道它在我的新项目中有所不同。结果在旧(工作)项目中,我只在 WebApi 控制器中进行 DI,而不是 MVC 控制器。我在 MVC 控制器中不需要 DI,所以我只是注释掉了引导 UnityDependencyResolver 作为 MVC 依赖解析器的代码(在我的例子中是 UnityMvcActivator 类)。
显然,这不是每个人的选择,但如果不是,@Adrian Brown 的答案看起来是你最好的选择,直到这个问题得到解决。