我最初使用VS2013向导创建了ASP.NET Web API 2,该向导默认使用IIS express托管,并且它有一个名为HomeController
的默认控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Title = "Home Page";
return View();
}
}
通过以下网址和UI:
进行操作点击 API 链接,该链接提供用于描述所有API控制器界面的摘要报告,然后用户开发人员知道如何调用这些API:
后来,我试图将此项目切换为自托管,我基本上什么也没做,只是将项目类型更改为控制台并添加Program.cs
,最后添加了一个新的SelfHostStartup.cs
:
public class SelfHostStartup
{
// This code configures Web API. The Startup class is specified as a type
// parameter in the WebApp.Start method.
public void Configuration(IAppBuilder appBuilder)
{
// Configure Web API for self-host.
var config = new HttpConfiguration();
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
ConfigureAuth(appBuilder);
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// !possible! the HOME page route settings.
RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
RouteTable.Routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { id = UrlParameter.Optional }
);
appBuilder.UseWebApi(config);
}
运行Console程序后,所有API控制器都在浏览器中测试正常,但是再次使用这些URL进行测试
http://localhost:9000/home/index
http://localhost:9000/api/home/index
未找到与请求URI匹配的HTTP资源' http://localhost:9000/api/home/index'。 未找到与名为' home'的控制器匹配的类型。
http://localhost:9000/home/
我想这与html和js文件加载有关,似乎自主机模式没有加载这些文件?
任何人都可以提供帮助吗?
答案 0 :(得分:0)
我做了一些工作来通过添加另一个控制器来实现类似的功能,并添加一个函数来列出所有已存在的API:
public class CloudApiParameter
{
public string ParameterName { get; set; }
public string ParameterType { get; set; }
}
public class CloudApiDescription
{
public string Id { get; set; }
public string RelativePath { get; set; }
public string Document { get; set; }
public IEnumerable<CloudApiParameter> Parameters { get; set; }
}
public IEnumerable<CloudApiDescription> Get()
{
var apiDescs = Configuration.Services.GetApiExplorer().ApiDescriptions;
return apiDescs.Select(r => new CloudApiDescription()
{
Id = r.GetFriendlyId(),
RelativePath = r.RelativePath,
Document = r.Documentation,
Parameters = (r.ParameterDescriptions.Any() ? r.ParameterDescriptions.Select(p => new CloudApiParameter()
{
ParameterName = p.ParameterDescriptor.ParameterName,
ParameterType = p.ParameterDescriptor.ParameterType.ToString()
}): null)
});
}