C#WebAPI捕获所有URL,不捕获扩展名的URL

问题描述

我有一个端点,无论URL是什么,我都希望捕获所有POST。

目前,我有

public class ProxyController : ApiController
    {
        [Route("{*url}")]
        [HttpPost]
        public async Task<HttpResponseMessage> Post()
        {
             .............

这对于'http:// localhost:64578 / SomeRoute'这样的网址非常有用

端点被命中。

但是,一旦我添加了扩展名,例如。

'http:// localhost:64578 / SomeRoute.svc'

端点不会受到攻击。

但是它将命中'http:// localhost:64578 / SomeRoute.svc /'

但是我真的需要前者。

我的路线设置如下:

public static void Register(HttpConfiguration config)
        {
            var container = StructureMapIoC.GetStructureMapContainer();
            ConfigStructureMapContainer(config,container);

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",routeTemplate: "{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional }
            );
        }

有人能解释原因并建议如何解决吗?

解决方法

这应该捕获所有扩展名为{*.*}的所有路由

编辑:测试了ASP.net MVC4 WebApi route with file-name in it中的某些选项。

  • [Route("{*.*}")]
  • 的组合
<system.webServer>
  <handlers>
    <add name="ManagedFilesExtension" path="*.*" verb="POST" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

有效,但不适用于所有扩展名(例如* .svc无效)

  • [Route("{*.*}")] +
  • 相同
<system.webServer>
  <modules runAllManagedModulesForAllRequests="true" />
</system.webServer>

但是此选项如果性能较差,因为它可以捕获所有请求类型(第一个仅捕获POST)