想象一下:
客户端应用程序,无人控制,调用Web API方法,但这些方法中的每一种都以扩展名结束,例如:
/api/{controller}/{method}.ab
如何为特定的控制器配置ASP.NET Web API,以允许调用方法的扩展,但也允许现有的默认控制器继续工作?
例如,如果我们有一个方法调用GetCustomer
,客户端应用程序将调用GetCustomer.ab
,但希望将该调用路由到GetCustomer
这是控制器中的方法&#34 ;客户",所以像这样:
http://fake.com/api/SmallService/GetCustomer.ab
SmallService
是特定控制器。
还有其他控制器,但只想将此类路由应用于特定控制器。
由于性能和安全原因,也不能选择启用RAMMFAR(RunAllManagedModulesForRequests
)。
这适用于在.NET 4.6上运行的ASP.NET Web API
答案 0 :(得分:2)
首先,配置web.config
以允许具有特定文件扩展名的请求传递给mvc框架。
问题是IIS会将
.ab
文件作为静态文件处理 默认情况下,不会通过MVC路由假设的.ab
文件 应用。 IIS处理请求,您的MVC代码永远不会得到 有机会路由到这个文件。
总之,以下是使.ab
文件有效的配置:
<system.webServer>
<handlers>
<!-- other handlers -->
<add name="ABHandler"
path="*.ab"
verb="GET" type="System.Web.Handlers.TransferRequestHandler"
preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />
<!-- other handlers -->
</handlers>
</system.webServer>
请注意处理程序中允许的动词。相应更新以满足服务需求。
接下来,如果这些请求仅适用于一个控制器,则将路由映射到目标控制器。
如果所有操作都属于特定控制器,则可以应用基于约定的方法。
public static class WebApiConfig
public static void Register(HttpConfiguration config) {
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "SmallServiceApi",
routeTemplate: "api/SmallService/{action}.ab",
defaults: new { controller = "SmallService" }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
通过属性路由还有另一种方法。
[RoutePrefix("api/SmallService"]
public class SmallServiceController : ApiController {
//GET api/SmallService/GetCustomer.ab
[HttpGet]
[Route("GetCustomer.ab")]
public IHttpActionResult GetCustomer() { ... }
}
回顾这种方法,根据你的偏好,你必须标记各自控制器上的所有动作,如果有很多,那么这可能会变得非常重复。