配置路由以允许点作为扩展?

时间:2016-11-12 09:09:33

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

想象一下:

客户端应用程序,无人控制,调用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

1 个答案:

答案 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() { ... }

}

回顾这种方法,根据你的偏好,你必须标记各自控制器上的所有动作,如果有很多,那么这可能会变得非常重复。