配置路由,允许作为点扩展?(Configuring Route to allow dot as ex

2019-09-30 11:37发布

想象一下以下内容:

客户端应用程序,这是任何一个有控制权,调用的Web API的方法,但在扩展,如每种方法的结尾:

/api/{controller}/{method}.ab

这怎么可能配置的ASP.NET Web API,用于特定的控制器,允许被调用的方法扩展也让现有的默认控制器继续工作?

举例来说,如果我们有一个方法调用GetCustomer ,客户端应用程序将调用GetCustomer.ab但希望该呼叫路由到GetCustomer这是在控制器“客户”的方法,所以是这样的:

http://fake.com/api/SmallService/GetCustomer.ab

SmallService是特定的控制器。

还有其他的控制器,但只希望这种类型的路由适用于特定的控制器。

启用RAMMFAR不是一个选项是( RunAllManagedModulesForRequests )由于性能和安全方面的原因了。

这是对的ASP.NET Web API 2 .NET 4.6运行

Answer 1:

首先,配置web.config ,以便与特定的文件扩展名的请求传递到MVC框架。

问题是,IIS将处理.ab文件为静态文件,默认会不会路由假设.ab文件通过你的MVC应用程序。 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() { ... }

}

缺点这种方法,根据自己的喜好,是你必须标记所有在其各自的控制器的操作,如果有很多那么这可能会变得非常重复。



文章来源: Configuring Route to allow dot as extension?