Web Api 2路由属性的全局路由前缀?

时间:2014-02-27 13:51:27

标签: asp.net-mvc asp.net-web-api asp.net-web-api-routing

我想通过两种方式揭露公司的api:

  • api.company.com (纯WebApi网站)

  • company.com/api (将WebApi添加到现有的MVC5公司网站)

因此,我将模型/控制器放在一个单独的程序集中,并从两个网站引用它。

另外,我使用路由属性:

[RoutePrefix("products")]
public class ProductsController : ApiController

现在,上面的控制器可以通过以下方式访问:

  • api.company.com/products 这很好

  • company.com/products 我想将其更改为 company.com/api/products

有没有办法继续使用路由属性和设置MVC项目,以便为所有路由添加“api”?

4 个答案:

答案 0 :(得分:9)

所以这可能不是你能做到的唯一方法,但这就是我要做的事情:

  1. 创建自己继承自RoutePrefixAttribute
  2. 的属性
  3. 覆盖Prefix属性并在其中添加一些逻辑,以便在所需服务器上运行时将“api”添加到前缀中。
  4. 根据您的web.config中的设置,预先添加到路由。

    public class CustomRoutePrefixAttribute : RoutePrefixAttribute
    {
    
      public CustomRoutePrefixAttribute(string prefix) : base(prefix)
      {
      }
    
      public override string Prefix
      {
        get
        {
            if (Configuration.PrependApi)
            {
                return "api/" + base.Prefix;
            }
    
            return base.Prefix;
        }
      }
    }
    
  5. 修改 (从Web API 2.2开始不再支持以下选项)

    或者,您也可以指定多个路由前缀:

    [RoutePrefix("api/products")]
    [RoutePrefix("products")]
    public class ProductsController : ApiController
    

答案 1 :(得分:5)

您可以在IAppBuilder上使用Map

所以Startup类看起来像这样

class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Map("/api", map =>
        {
            HttpConfiguration config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            map.UseWebApi(config);
        });

    }
}

答案 2 :(得分:1)

另一种选择是将流量从一个站点转发到您的Web API。您是否已设置托管两个实例?如果没有,您只能在say api.company.com/products下托管一个实例。在您的MVC公司站点上实现HttpHandler以将匹配/ api / *的所有流量重定向到api.company.com:

一个。在MVC应用程序中创建处理程序:

public class WebApiHandler : IHttpHandler
{
  public void ProcessRequest(HttpContext context)
  {
    string url = "api.company.com" + context.Request.RawUrl.Replace("/api","");

    //Create new request with context.Request's headers and content
    //Write the new response headers and content to context.Response    
  }
}

湾在web.config中注册处理程序:

<configuration>
  <system.web>
    <httpHandlers>
      <add verb="*" path="api/*" type="Name.Space.WebApiHandler" validate="false" />
    </httpHandlers>
  </system.web>
</configuration>

℃。如果尚未在Web API中启用CORS,请执行此操作。

答案 3 :(得分:0)

您可以将您的api服务实现为www.mycompany.com/api。

然后使用UrlRewrite将api.mycompany.com映射到www.mycompany.com/api

我们甚至在链接生成中支持UrlRewrite的这种方法,因此如果您从api.mycompany.com生成链接,您的链接将指向api.mycompany.com/controller/id。

请注意,这是唯一可以正确生成MVC链接的URL重写形式(api.xxx.yyy - &gt; www.xxx.yyy / api)