web api 2区域路线

时间:2015-03-18 14:58:45

标签: asp.net-mvc-5 asp.net-mvc-routing asp.net-web-api2 asp.net-mvc-areas

我正在使用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是正确的...(未显示)......

但是现在我想在我的AREAS工作中获取web api 2 ...

我已经阅读了我在网上找到的所有内容,这似乎应该是这样 工作:

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()

和&#34;真实&#34;案例

  public IEnumerable<VwAuditModel1> GetAuditModels()

返回相同的结果。从浏览器中,使用

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>

3 个答案:

答案 0 :(得分:4)

您需要从HttpConfiguration对象获取GlobalConfiguration个实例,并从MapHttpAttributeRoutes()的{​​{1}}方法中调用RegisterArea()方法。

AreaRegistration.cs

最后,您必须使用 public override void RegisterArea(AreaRegistrationContext context) { GlobalConfiguration.Configuration.MapHttpAttributeRoutes(); //... omitted code } 删除WebApiConfig方法,否则您将获得重复的例外。

config.MapHttpAttributes()

答案 1 :(得分:3)

该特定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}段,否则无法知道将哪个段用作控制器名称。

答案 2 :(得分:3)

首先,您应该使用它所属的区域注册路线,这只是有意义的,因此在AreaNameAreaRegistration班级内请务必添加using System.Web.Http,以便获得扩展方法{{1} },它不属于MapHttpRoute

上面的顺序有点偏,导致404.添加以下路线:

System.Web.Mvc

如果你想获得想象并从属性context.Routes.MapHttpRoute( name: "AreaNameWebApi", routeTemplate: "api/AreaName/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); 附加区域名称(当然你关心良好的编码实践;)):

AreaName

这将纠正404问题。默认情况下,在Web API模块中,它首先扫描&#34; api&#34;确定在哪里寻找控制器(否则它会被混淆,它不是魔术)所以当动态附加区域名称和控制器时,api需要是第一个。当然,您可以通过对路线进行硬编码来更改此顺序,但我不建议这样做,因为您需要提供路径配置中的每个路径和每个控制器或使用context.Routes.MapHttpRoute( name: "AreaNameWebApi", routeTemplate: string.Concat("api/", AreaName, "/{controller}/{id}"), defaults: new { id = RouteParameter.Optional } );

另外,使用&#34; api&#34;首先,它将为您和您的用户制作一个标准的标准URL,而不是在所有地方都有API。以下是一些示例:

RouteAttribute

希望这有帮助!

泽夫