我想通过两种方式揭露公司的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”?
答案 0 :(得分:9)
所以这可能不是你能做到的唯一方法,但这就是我要做的事情:
根据您的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;
}
}
}
修改强> (从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)