【问题标题】:C# WebAPI catch all url not catching urls with extensionsC# WebAPI 捕获所有 url 不捕获带有扩展名的 url
【发布时间】:2021-01-27 05:12:10
【问题描述】:

我有一个端点,无论 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 }
            );
        }

是否有人能够解释原因并建议如何解决?

【问题讨论】:

  • 您真的需要 POST 数据吗?或者这基本上需要一个包罗万象的 404 处理程序?

标签: c# api asp.net-web-api asp.net-web-api-routing webapi


【解决方案1】:

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

编辑:测试了来自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)

【讨论】:

  • 测试了一些解决方案并更新了答案。这应该会有所帮助
猜你喜欢
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 2019-10-20
相关资源
最近更新 更多