Чтобы захватить субдомен при использовании веб-API, переопределите селектор действий, чтобы ввести параметр запроса subdomain
. Затем используйте параметры запроса поддомена в действиях ваших контроллеров следующим образом:
public string Get(string id, string subdomain)
Этот подход делает отладку удобной, поскольку вы можете указать параметр запроса вручную при использовании localhost вместо фактическое имя хоста (подробности см. в стандартном ответе маршрутизации MVC5 ). Это код для Action Selector:
class SubdomainActionSelector : IHttpActionSelector
{
private readonly IHttpActionSelector defaultSelector;
public SubdomainActionSelector(IHttpActionSelector defaultSelector)
{
this.defaultSelector = defaultSelector;
}
public ILookup GetActionMapping(HttpControllerDescriptor controllerDescriptor)
{
return defaultSelector.GetActionMapping(controllerDescriptor);
}
public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
{
var routeValues = controllerContext.Request.GetRouteData().Values;
if (!routeValues.ContainsKey("subdomain")) {
string host = controllerContext.Request.Headers.Host;
int index = host.IndexOf('.');
if (index >= 0)
controllerContext.Request.GetRouteData().Values.Add("subdomain", host.Substring(0, index));
}
return defaultSelector.SelectAction(controllerContext);
}
}
Замените селектор действий по умолчанию, добавив его в WebApiConfig.Register
:
config.Services.Replace(typeof(IHttpActionSelector), new SubdomainActionSelector(config.Services.GetActionSelector()));