ASP.NET WebApi 不工作。所有路线 return 404
ASP.NET WebApi not working. All routes return 404
我有一个 asp.net 网络 api,其中 Unity
作为我的依赖项解析器,OWIN
用于 OAuth 身份验证。
我使用 Visual Studio "Add New Item" 菜单创建 Startup.cs
,选择 OWIN 启动 class:
[assembly: OwinStartup(typeof(MyNameSpace.Startup))]
namespace MyNameSpace
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
WebApiConfig.Register(config);
config.DependencyResolver = new UnityHierarchicalDependencyResolver(UnityConfig.GetConfiguredContainer());
app.UseWebApi(config);
}
}
}
我的 WebApiConfig.cs
看起来像这样:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
现在,当我启动应用程序时,我收到默认 url 即 http://localhost:port/
的 Forbidden 响应。网站 api 托管在 http://localhost:port/api/
。当我在应用程序中请求此 url 或 any 控制器时,它会响应 Not Found.
此外,当我在 Startup
class 的 Configuration
方法中放置断点时;一旦我启动应用程序,它就会显示以下内容(我不知道它是否相关):
我不知道出了什么问题。它昨晚成功了,我是唯一一个一直在从事这个项目的人。我唯一做的就是从 NuGet
添加 OData
引用,但是一旦我确定 api 没有工作,我又删除了那些。
编辑:
我应该补充一点,我在应用程序中设置的 任何 断点当前在我将鼠标悬停在它上面时会显示相同的消息,所以也许它毕竟是相关的。
编辑 2:
这是摘自 EmployeeController.cs
:
[Authorize]
public class EmployeeController : ApiController
{
private readonly IEmployeeService _service;
public EmployeeController(IEmployeeService employeeService)
{
_service = employeeService;
}
[HttpGet]
[ResponseType(typeof(Employee))]
public IHttpActionResult GetEmployee(string employeeId)
{
var result = _service.GetEmployees().FirstOrDefault(x => x.Id.Equals(employeeId));
if (result != null)
{
return Ok(result);
}
return NotFound();
}
[HttpGet]
[ResponseType(typeof (IQueryable<Employee>))]
public IHttpActionResult GetEmployees()
{
return Ok(_service.GetEmployees());
}
...
编辑 3
按照建议重新启动 Visual Studio 后,我可以确认断点警告仍然存在并显示在整个应用程序中:
编辑 4
删除 OWIN
引用和 Startup.cs
,应用程序现在恢复了活力。我能够再次放置断点并进行 api 调用。怎么回事?
WebAPI 操作方法基于 HTTP 动词。
如果您想命名除 HTTP Verb 之外的操作方法,您需要查看 Attribute Routing。
在您的示例中,您使用的是简单的 HTTP 动词。如果是这样,你只需要 Get.
public class EmployeeController : ApiController
{
// GET api/employee
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/employee/5
public string Get(int id)
{
return "value";
}
}
只是关于断点不吸引人的一点,我自己也有这个问题。意识到在我将应用程序发布到 Web 服务器后,VS2013 实际上已经根据我为发布所做的 web.config 转换更新了我的 web.config,并关闭了调试(根据我的转换)。可能是我是新手,这是正确的行为,但这不是理想的行为! :) 这个 post 很旧,我知道,但如果它能帮助任何有相同症状的人,那就太好了。
我有同样的问题,所有端点都返回 404。我注意到 WebApiConfig.Register 从未调用过。
所以确保它被调用,如果你的项目中有一个 Global.asax 文件(就像我的情况)确保你在 Application_Start:
上启用了这个调用
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
我有一个 asp.net 网络 api,其中 Unity
作为我的依赖项解析器,OWIN
用于 OAuth 身份验证。
我使用 Visual Studio "Add New Item" 菜单创建 Startup.cs
,选择 OWIN 启动 class:
[assembly: OwinStartup(typeof(MyNameSpace.Startup))]
namespace MyNameSpace
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
WebApiConfig.Register(config);
config.DependencyResolver = new UnityHierarchicalDependencyResolver(UnityConfig.GetConfiguredContainer());
app.UseWebApi(config);
}
}
}
我的 WebApiConfig.cs
看起来像这样:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
现在,当我启动应用程序时,我收到默认 url 即 http://localhost:port/
的 Forbidden 响应。网站 api 托管在 http://localhost:port/api/
。当我在应用程序中请求此 url 或 any 控制器时,它会响应 Not Found.
此外,当我在 Startup
class 的 Configuration
方法中放置断点时;一旦我启动应用程序,它就会显示以下内容(我不知道它是否相关):
我不知道出了什么问题。它昨晚成功了,我是唯一一个一直在从事这个项目的人。我唯一做的就是从 NuGet
添加 OData
引用,但是一旦我确定 api 没有工作,我又删除了那些。
编辑:
我应该补充一点,我在应用程序中设置的 任何 断点当前在我将鼠标悬停在它上面时会显示相同的消息,所以也许它毕竟是相关的。
编辑 2:
这是摘自 EmployeeController.cs
:
[Authorize]
public class EmployeeController : ApiController
{
private readonly IEmployeeService _service;
public EmployeeController(IEmployeeService employeeService)
{
_service = employeeService;
}
[HttpGet]
[ResponseType(typeof(Employee))]
public IHttpActionResult GetEmployee(string employeeId)
{
var result = _service.GetEmployees().FirstOrDefault(x => x.Id.Equals(employeeId));
if (result != null)
{
return Ok(result);
}
return NotFound();
}
[HttpGet]
[ResponseType(typeof (IQueryable<Employee>))]
public IHttpActionResult GetEmployees()
{
return Ok(_service.GetEmployees());
}
...
编辑 3
按照建议重新启动 Visual Studio 后,我可以确认断点警告仍然存在并显示在整个应用程序中:
编辑 4
删除 OWIN
引用和 Startup.cs
,应用程序现在恢复了活力。我能够再次放置断点并进行 api 调用。怎么回事?
WebAPI 操作方法基于 HTTP 动词。
如果您想命名除 HTTP Verb 之外的操作方法,您需要查看 Attribute Routing。
在您的示例中,您使用的是简单的 HTTP 动词。如果是这样,你只需要 Get.
public class EmployeeController : ApiController
{
// GET api/employee
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/employee/5
public string Get(int id)
{
return "value";
}
}
只是关于断点不吸引人的一点,我自己也有这个问题。意识到在我将应用程序发布到 Web 服务器后,VS2013 实际上已经根据我为发布所做的 web.config 转换更新了我的 web.config,并关闭了调试(根据我的转换)。可能是我是新手,这是正确的行为,但这不是理想的行为! :) 这个 post 很旧,我知道,但如果它能帮助任何有相同症状的人,那就太好了。
我有同样的问题,所有端点都返回 404。我注意到 WebApiConfig.Register 从未调用过。 所以确保它被调用,如果你的项目中有一个 Global.asax 文件(就像我的情况)确保你在 Application_Start:
上启用了这个调用 protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}