问题描述
目前,我有:
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)