想象一下以下内容:
客户端应用程序,这是任何一个有控制权,调用的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运行
首先,配置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() { ... }
}
缺点这种方法,根据自己的喜好,是你必须标记所有在其各自的控制器的操作,如果有很多那么这可能会变得非常重复。