web api 2 条区域路线
web api 2 area routes
我正在使用 asp.net mvc 5 和 web api 2。对于 asp.net mvc 5 项目,我一切正常......但是新的我正在尝试添加 web api 2 条路线...当我使用区域时。
我有 web api 2 控制器在项目根目录下工作:
//this is working
namespace EtracsWeb.Controllers
{
public class TestController : ApiController
{
//localhost:port/api/test ...this is working
[HttpGet]
public HttpResponseMessage Get()
{
return new HttpResponseMessage()
{
Content = new StringContent("GET: Test message")
};
}
}
}
所以我假设我的 Global.asax
、我的 routeconfig.cs
和我的 webapiconfig.cs
是正确的...(未显示)...
但现在我正在尝试让网络 api 2 在我的 AREAS 工作...
我已经阅读了我在网上能找到的所有内容,这似乎应该如此
工作:
namespace EtracsWeb.Areas.WorkOrder
{
public class WorkOrderAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "WorkOrder";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.MapHttpRoute(
name: "AuditModel_Api",
routeTemplate: "WorkOrder/api/AuditModelApi/{id}",
defaults: new { id = RouteParameter.Optional }
);
//default
context.Routes.MapHttpRoute(
name: "WorkOrder_Api",
routeTemplate: "WorkOrder/api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
context.MapRoute(
"WorkOrder_default",
"WorkOrder/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
}
我的控制器代码是:
namespace EtracsWeb.Areas.WorkOrder.ApiControllers
{
public class AuditModelApiController : ApiController
{
IManufacturerStopOrderModelService auditModelService = new WorkOrder.Services.VWAuditModelService(UserSession.EtracsUserID, UserSession.ProgramID, UserSession.EtracsSessionID, UserSession.ConnectionString);
[HttpGet]
[Route("AuditModelApi")]
public HttpResponseMessage Get()
{
return new HttpResponseMessage()
{
Content = new StringContent("GET: Test message")
};
}
[Route("AuditModelApi/AuditModels")]
public IEnumerable<VwAuditModel1> GetAuditModels()
{
return auditModelService.GetModels();
}
public IHttpActionResult UpdateAuditMode()
{
//example of what can be returned ... NotFound, Ok ... look into uses...
VwAuditModel1 result = new VwAuditModel1();
return Ok(result);
return NotFound();
}
}
}
我已经尝试过使用和不使用属性命名的控制器 [Route]
...
而且我无法上班...
都是简单的情况
public HttpResponseMessage Get()
和 "real" 案例
public IEnumerable<VwAuditModel1> GetAuditModels()
return同样的结果。在浏览器中,使用
http://localhost:64167/WorkOrder/api/AuditModelApi
和
http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels
我得到以下信息:
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels'.
</Message>
<MessageDetail>
No route providing a controller name was found to match request URI 'http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels'
</MessageDetail>
</Error>
该特定 API 调用的问题是您没有指定要在路线中使用的控制器。
context.Routes.MapHttpRoute(
name: "AuditModel_Api",
routeTemplate: "WorkOrder/api/AuditModelApi/{id}",
defaults: new { id = RouteParameter.Optional }
);
应该是
context.Routes.MapHttpRoute(
name: "AuditModel_Api",
routeTemplate: "WorkOrder/api/AuditModelApi/{id}",
defaults: new { controller = "AuditModelApi", id = RouteParameter.Optional }
);
URL 中的常量段用于指定要匹配的 URL,但您仍然必须告诉它路由值是什么,以便它到达控制器和操作。它无法知道将哪个段用作控制器名称,除非您将其设为 {controller}
段。
首先,你应该用它所属的区域注册路线,这才有意义,所以在你的 AreaNameAreaRegistration
class 里面一定要添加 using System.Web.Http
所以你得到扩展方法 MapHttpRoute
,它不是 System.Web.Mvc
的一部分。
上面的顺序有点不对,导致404。添加以下路由:
context.Routes.MapHttpRoute(
name: "AreaNameWebApi",
routeTemplate: "api/AreaName/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
如果你想要花哨的并附加 属性 AreaName
中的区域名称(当然你关心良好的编码习惯;)):
context.Routes.MapHttpRoute(
name: "AreaNameWebApi",
routeTemplate: string.Concat("api/", AreaName, "/{controller}/{id}"),
defaults: new { id = RouteParameter.Optional }
);
这将更正 404 问题。在 Web API 模块中,默认情况下它首先扫描 "api" 以确定在哪里寻找控制器(否则它会混淆,这不是魔术)所以 api 需要在第一位动态附加区域名称和控制器时。当然,您可以通过对路由进行硬编码来更改此顺序,但我不建议这样做,因为您需要在路由配置中提供每条路由和每个控制器,或者使用 RouteAttribute
.
此外,首先使用 "api" 它将为您和您的用户制作一个漂亮的标准外观 URL,而不是到处都是 API。以下是一些示例:
http://site/api/members/myAccount/update
http://site/api/members/myAccount/get/12345
http://site/api/members/contacts/getByOwnerId/12345
希望对您有所帮助!
Zev
您需要从 GlobalConfiguration
对象中获取 HttpConfiguration
实例,并从 AreaRegistration.cs
的 RegisterArea()
方法内部调用 MapHttpAttributeRoutes()
方法。
public override void RegisterArea(AreaRegistrationContext context)
{
GlobalConfiguration.Configuration.MapHttpAttributeRoutes();
//... omitted code
}
最后你必须在 WebApiConfig
中删除 config.MapHttpAttributes()
方法,否则你将得到重复的异常。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.EnableCors();
// Configure Web API to use only bearer token authentication.
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 }
);
}
}
我正在使用 asp.net mvc 5 和 web api 2。对于 asp.net mvc 5 项目,我一切正常......但是新的我正在尝试添加 web api 2 条路线...当我使用区域时。
我有 web api 2 控制器在项目根目录下工作:
//this is working
namespace EtracsWeb.Controllers
{
public class TestController : ApiController
{
//localhost:port/api/test ...this is working
[HttpGet]
public HttpResponseMessage Get()
{
return new HttpResponseMessage()
{
Content = new StringContent("GET: Test message")
};
}
}
}
所以我假设我的 Global.asax
、我的 routeconfig.cs
和我的 webapiconfig.cs
是正确的...(未显示)...
但现在我正在尝试让网络 api 2 在我的 AREAS 工作...
我已经阅读了我在网上能找到的所有内容,这似乎应该如此 工作:
namespace EtracsWeb.Areas.WorkOrder
{
public class WorkOrderAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "WorkOrder";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.MapHttpRoute(
name: "AuditModel_Api",
routeTemplate: "WorkOrder/api/AuditModelApi/{id}",
defaults: new { id = RouteParameter.Optional }
);
//default
context.Routes.MapHttpRoute(
name: "WorkOrder_Api",
routeTemplate: "WorkOrder/api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
context.MapRoute(
"WorkOrder_default",
"WorkOrder/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
}
}
我的控制器代码是:
namespace EtracsWeb.Areas.WorkOrder.ApiControllers
{
public class AuditModelApiController : ApiController
{
IManufacturerStopOrderModelService auditModelService = new WorkOrder.Services.VWAuditModelService(UserSession.EtracsUserID, UserSession.ProgramID, UserSession.EtracsSessionID, UserSession.ConnectionString);
[HttpGet]
[Route("AuditModelApi")]
public HttpResponseMessage Get()
{
return new HttpResponseMessage()
{
Content = new StringContent("GET: Test message")
};
}
[Route("AuditModelApi/AuditModels")]
public IEnumerable<VwAuditModel1> GetAuditModels()
{
return auditModelService.GetModels();
}
public IHttpActionResult UpdateAuditMode()
{
//example of what can be returned ... NotFound, Ok ... look into uses...
VwAuditModel1 result = new VwAuditModel1();
return Ok(result);
return NotFound();
}
}
}
我已经尝试过使用和不使用属性命名的控制器 [Route]
...
而且我无法上班...
都是简单的情况
public HttpResponseMessage Get()
和 "real" 案例
public IEnumerable<VwAuditModel1> GetAuditModels()
return同样的结果。在浏览器中,使用
http://localhost:64167/WorkOrder/api/AuditModelApi
和
http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels
我得到以下信息:
<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels'.
</Message>
<MessageDetail>
No route providing a controller name was found to match request URI 'http://localhost:64167/WorkOrder/api/AuditModelApi/AuditModels'
</MessageDetail>
</Error>
该特定 API 调用的问题是您没有指定要在路线中使用的控制器。
context.Routes.MapHttpRoute(
name: "AuditModel_Api",
routeTemplate: "WorkOrder/api/AuditModelApi/{id}",
defaults: new { id = RouteParameter.Optional }
);
应该是
context.Routes.MapHttpRoute(
name: "AuditModel_Api",
routeTemplate: "WorkOrder/api/AuditModelApi/{id}",
defaults: new { controller = "AuditModelApi", id = RouteParameter.Optional }
);
URL 中的常量段用于指定要匹配的 URL,但您仍然必须告诉它路由值是什么,以便它到达控制器和操作。它无法知道将哪个段用作控制器名称,除非您将其设为 {controller}
段。
首先,你应该用它所属的区域注册路线,这才有意义,所以在你的 AreaNameAreaRegistration
class 里面一定要添加 using System.Web.Http
所以你得到扩展方法 MapHttpRoute
,它不是 System.Web.Mvc
的一部分。
上面的顺序有点不对,导致404。添加以下路由:
context.Routes.MapHttpRoute(
name: "AreaNameWebApi",
routeTemplate: "api/AreaName/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
如果你想要花哨的并附加 属性 AreaName
中的区域名称(当然你关心良好的编码习惯;)):
context.Routes.MapHttpRoute(
name: "AreaNameWebApi",
routeTemplate: string.Concat("api/", AreaName, "/{controller}/{id}"),
defaults: new { id = RouteParameter.Optional }
);
这将更正 404 问题。在 Web API 模块中,默认情况下它首先扫描 "api" 以确定在哪里寻找控制器(否则它会混淆,这不是魔术)所以 api 需要在第一位动态附加区域名称和控制器时。当然,您可以通过对路由进行硬编码来更改此顺序,但我不建议这样做,因为您需要在路由配置中提供每条路由和每个控制器,或者使用 RouteAttribute
.
此外,首先使用 "api" 它将为您和您的用户制作一个漂亮的标准外观 URL,而不是到处都是 API。以下是一些示例:
http://site/api/members/myAccount/update
http://site/api/members/myAccount/get/12345
http://site/api/members/contacts/getByOwnerId/12345
希望对您有所帮助!
Zev
您需要从 GlobalConfiguration
对象中获取 HttpConfiguration
实例,并从 AreaRegistration.cs
的 RegisterArea()
方法内部调用 MapHttpAttributeRoutes()
方法。
public override void RegisterArea(AreaRegistrationContext context)
{
GlobalConfiguration.Configuration.MapHttpAttributeRoutes();
//... omitted code
}
最后你必须在 WebApiConfig
中删除 config.MapHttpAttributes()
方法,否则你将得到重复的异常。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
config.EnableCors();
// Configure Web API to use only bearer token authentication.
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 }
);
}
}