如何在 WEB Api 2 中有一个指向两个接受不同参数的不同控制器端点的路由
How to have a Route which points to two different controller end points which accepts different arguments in WEB Api 2
如何在 WEB 中创建一个指向两个接受不同参数的不同控制器端点的路由 Api 2
我在控制器中声明了两个不同的端点,至于 REST 透视图,我必须对两个端点都使用 alpha/{aplhaid}/beta 格式,
[Authorize]
[HttpPost]
[Route("alpha/{aplhaid}/beta")]
public async Task<HttpResponseMessage> CreateAlpha(Beta beta, string projectId, [FromHeader] RevisionHeaderModel revision)
[Authorize]
[HttpPost]
[Route("alpha/{aplhaid}/beta")]
public async Task<HttpResponseMessage> CreateAlpha(List<Beta> betas, string projectId, [FromHeader] RevisionHeaderModel revision)
是否可以使用具有不同参数的同一路由器指向 Web 中的 2 个不同端点API2?
使用一个路由并从第一个控制器调用内部的另一个控制器。
重载 web api
基于参数类型的操作方法未得到很好的支持。
但是 attribute based routing
呢?
你可以找出一个很好的例子here
路由约束让您可以限制路由模板中参数的匹配方式。一般语法是 "{parameter:constraint}"
。例如:
[Route("users/{id:int}"]
public User GetUserById(int id) { ... }
[Route("users/{name}"]
public User GetUserByName(string name) { ... }
而且我认为这个 link 一定是 helpful
如果您确实需要 相同的路线和相同的 ActionName,您可以使用 IHttpActionSelector
。
public class CustomActionSelector : ApiControllerActionSelector, IHttpActionSelector
{
public new HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
{
var context = HttpContext.Current;
// Read the content. Probably a better way of doing it?
var stream = new StreamReader(context.Request.InputStream);
var input = stream.ReadToEnd();
var array = new JavaScriptSerializer().Deserialize<List<string>>(input);
if (array != null)
{
// It's an array
//TODO: Choose action.
}
else
{
// It's not an array
//TODO: Choose action.
}
// Default.
var action = base.SelectAction(controllerContext);
return action;
}
public override ILookup<string, HttpActionDescriptor> GetActionMapping(HttpControllerDescriptor controllerDescriptor)
{
var lookup = base.GetActionMapping(controllerDescriptor);
return lookup;
}
}
在您的 WebApiConfig 中:
config.Services.Replace(
typeof(IHttpActionSelector),
new CustomActionSelector());
您的控制器示例:
public class FooController: ApiController
{
[HttpPost]
public string Post(string id)
{
return "String";
}
[HttpPost]
public string Post(List<string> id)
{
return "some list";
}
}
如果您问我,该解决方案有一些很大的缺点。首先,您应该寻找仅在需要时才使用此 CustomActionSelector
的解决方案。不适用于所有控制器,因为它会为每个请求产生开销。
我认为你应该重新考虑为什么你真的需要两条必须完全相同的路线。我认为如果同一条路线接受不同的论点,可读性将会受到影响。但这只是我的意见。
我会改用不同的路线。
如何在 WEB 中创建一个指向两个接受不同参数的不同控制器端点的路由 Api 2 我在控制器中声明了两个不同的端点,至于 REST 透视图,我必须对两个端点都使用 alpha/{aplhaid}/beta 格式,
[Authorize]
[HttpPost]
[Route("alpha/{aplhaid}/beta")]
public async Task<HttpResponseMessage> CreateAlpha(Beta beta, string projectId, [FromHeader] RevisionHeaderModel revision)
[Authorize]
[HttpPost]
[Route("alpha/{aplhaid}/beta")]
public async Task<HttpResponseMessage> CreateAlpha(List<Beta> betas, string projectId, [FromHeader] RevisionHeaderModel revision)
是否可以使用具有不同参数的同一路由器指向 Web 中的 2 个不同端点API2?
使用一个路由并从第一个控制器调用内部的另一个控制器。
重载 web api
基于参数类型的操作方法未得到很好的支持。
但是 attribute based routing
呢?
你可以找出一个很好的例子here
路由约束让您可以限制路由模板中参数的匹配方式。一般语法是 "{parameter:constraint}"
。例如:
[Route("users/{id:int}"]
public User GetUserById(int id) { ... }
[Route("users/{name}"]
public User GetUserByName(string name) { ... }
而且我认为这个 link 一定是 helpful
如果您确实需要 相同的路线和相同的 ActionName,您可以使用 IHttpActionSelector
。
public class CustomActionSelector : ApiControllerActionSelector, IHttpActionSelector
{
public new HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
{
var context = HttpContext.Current;
// Read the content. Probably a better way of doing it?
var stream = new StreamReader(context.Request.InputStream);
var input = stream.ReadToEnd();
var array = new JavaScriptSerializer().Deserialize<List<string>>(input);
if (array != null)
{
// It's an array
//TODO: Choose action.
}
else
{
// It's not an array
//TODO: Choose action.
}
// Default.
var action = base.SelectAction(controllerContext);
return action;
}
public override ILookup<string, HttpActionDescriptor> GetActionMapping(HttpControllerDescriptor controllerDescriptor)
{
var lookup = base.GetActionMapping(controllerDescriptor);
return lookup;
}
}
在您的 WebApiConfig 中:
config.Services.Replace(
typeof(IHttpActionSelector),
new CustomActionSelector());
您的控制器示例:
public class FooController: ApiController
{
[HttpPost]
public string Post(string id)
{
return "String";
}
[HttpPost]
public string Post(List<string> id)
{
return "some list";
}
}
如果您问我,该解决方案有一些很大的缺点。首先,您应该寻找仅在需要时才使用此 CustomActionSelector
的解决方案。不适用于所有控制器,因为它会为每个请求产生开销。
我认为你应该重新考虑为什么你真的需要两条必须完全相同的路线。我认为如果同一条路线接受不同的论点,可读性将会受到影响。但这只是我的意见。
我会改用不同的路线。