【问题标题】:ASP.Net Web API RoutePrefix partially ignoredASP.Net Web API RoutePrefix 部分被忽略
【发布时间】:2016-05-31 17:01:13
【问题描述】:

我正在尝试使用 RoutePrefix,但 ASP.NET 部分忽略了它。给定以下控制器(方法体和类字段已删除):

[RoutePrefix("api/users/sharepoint")]
public class SharePointController : ApiController
{


    public SharePointController(ISharePointUserRepository repo, IAzureUserRepository otherRepo)
    {

    }

    [HttpGet]
    public ExternalUser Get(int id)
    {

    }

    [HttpGet]
    public ExternalUser Get(Guid guid)
    {

    }

    [HttpGet]
    public IEnumerable<ExternalUser> Get()
    {

    }

    [HttpGet]
    public ExternalUser Get(string username)
    {

    }

    [HttpGet]
    public IEnumerable<ExternalUser> GetByPersonalEmail(string email)
    {

    }

    [HttpGet]
    [Route("GetWithDifferences")]
    public IEnumerable<ExternalUser> GetWithDifferences()
    {

    }

    [HttpGet]
    [Route("GetUnique")]
    public IEnumerable<ExternalUser> GetUnique()
    {


    }

    [HttpPost]
    [Route("search")]
    public IEnumerable<ExternalUser> Search([FromBody] ExternalUserSearchModel model)
    {

    }

我得到以下 API(通过主机/帮助):

共享点

获取 api/users/sharepoint/GetWithDifferences
获取 api/users/sharepoint/GetUnique
POST api/用户/共享点/搜索
获取 api/SharePoint/{id}
获取 api/SharePoint?guid={guid}
获取 api/SharePoint
GET api/SharePoint?username={用户名}
GET api/SharePoint?email={email}

经过测试,效果与宣传的一样。

如您所见,当我没有为公开的方法指定 [Route(..)] 时,RoutePrefix 将被忽略。但是我想要 GET 上的默认操作,所以我不想为这些指定任何额外的路由。

如何强制使用 RoutePrefix,或者,如何使用 [Route(..)] 维护默认的 GET 和 POST 行为?

【问题讨论】:

    标签: c# asp.net c#-4.0 asp.net-web-api asp.net-mvc-routing


    【解决方案1】:

    RoutePrefixAttribute 单独不定义任何路由,它只会将选择的前缀添加到使用此类属性装饰的类中定义的任何路由。

    然后您需要做出选择:仅使用属性路由(并为每个方法定义一个路由)以便您可以从RoutePrefix 中受益,或者保持代码不变,并定义另一个符合您的 URI 的约定路由.

    使用属性路由的示例:

    [HttpGet]
    [Route("{id:int}"]
    public ExternalUser Get(int id)
    { }
    
    [HttpGet]
    [Route(""]
    public ExternalUser Get(Guid guid)
    { }
    
    [HttpGet]
    [Route("")]
    public IEnumerable<ExternalUser> Get()
    { }
    
    [HttpGet]
    [Route("")]
    public ExternalUser Get(string username)
    { }
    

    这是第二种方法的另一个例子:

    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
    
        config.Routes.MapHttpRoute(
            name: "MyCustomApi",
            routeTemplate: "api/users/sharepoint/{id}",
            defaults: new { controller = "SharePoint", id = RouteParameter.Optional }
        );
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多