为什么MapHttpAttributeRoutes()不从属性添加路由?

时间:2019-03-31 10:17:11

标签: c# routes asp.net-web-api2

我有一些自己的控制器,并且路由基本上是根据属性进行的。问题是,当我用Postman模拟我的http请求时,该程序似乎不知道所提供的路由。

我的控制器如下所示:

{{ form_label(form.moisAnne) }}
    <div class="form-group">
        <label class="nom-l-kiity"> mois </label>
        {{ form_widget(form.moisAnne) }}
    </div>
    {{ form_errors(form.moisAnne) }}

    {{ form_label(form.moisAnne) }}
    <div class="form-group">
        <label class="nom-l-kiity"> mois </label>
        {{ form_widget(form.moisAnne) }}
    </div>
    {{ form_errors(form.moisAnne) }}
here mois == month 
and annee == year

请注意,Global.asax.cs调用了与Web Api 2兼容的配置:

[RoutePrefix("register")]
public class RegisterController : ApiController
{
    private readonly IRegisterService _service;

    public RegisterController(IRegisterService service)
    {
        _service = service;
    }

    [HttpPost]
    [Route("simple")]
    public void RegisterSimple(RegisterArgs args)
    {
        _service.RegisterSimple(args);
    }
}

...并且WebApiConfig调用MapHttpAttributeRoutes():

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);

        // DI Registrations
    }
}

当我尝试使用uri从Postman调用POST方法时

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

我得到以下答案:

http://localhost:63575/api/register/simple

我确实认为问题出在路由配置中。我对其进行了调试,在两个方法调用(config.MapHttpAttributeRoutes()和config.Routes.MapHttpRoute)之后,配置仅包含两个路由:一个具有空RouteTemplate(“”),另一个具有通过MappHttpRoute()调用提供的路由(“ api / {controller} / {id}”)。 我的问题是-如何通过属性正确配置路由?

1 个答案:

答案 0 :(得分:0)

您的控制器级路由前缀应以“ api”开头,如下所示:

[RoutePrefix("api/register")]
public class RegisterController : ApiController