WebAPI Прокси бросает 404 для URL-адресов с недопустимыми символами
Я использую C# .NET WebApi для создания прокси API, вот базовый код, который у меня есть, который отлично работает для большинства вызовов:
[HttpGet]
[Route("api/proxy/{*.}")]
public async Task<HttpResponseMessage> Get()
{
// some route here...
}
Но когда у меня есть URL со специальными символами, такими как : (%3F) или / (%2F), это не удается с 404. Если я удалю специальные символы, это сработает.
http://localhost:3000/api/proxy/viewing/v1/items/urn%3Aadsk.viewing%3Afs.file%3AdXJuOmVUE_dmVyc2lvbj0x%2Foutput%2Fd4b6ef1c-8d219bd84c9d%2F0.pf?domain=http%3A%2F%2Flocalhost%3A3000
И попробовал несколько предложений в интернете.config, но ничего:
<system.web>
<httpRuntime targetFramework="4.6" requestPathInvalidCharacters=""/>
<pages validateRequest="false" />
</system.web>
Все остальные конечные точки WebApi работают с глобальной.asax вот так:
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configure(Config.WebApiConfig.Register);
}
}
И конфигурация.WebApiConfig:
public class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
}
}
2 ответа:
Согласно ответу MVC Web API routing терпит неудачу, когда url содержит закодированный амперсанд вам нужно удалить символы, которые вы считаете допустимыми из Свойства
requestPathInvalidCharacters
httpruntime
:Но гораздо безопаснее передавать эти параметры в виде строки запроса.<httpruntime requestvalidationmode="2.0"> requestPathInvalidCharacters="*,:,&,\" relaxedUrlToFileSystemMapping="true" />
Редактировать:
Я проверил url-форму вашего вопроса
http://localhost:3000/proxy/target/v1/urn%3Aparam%2Foutpu?domain=http%3A%2F%2Flocalhost%3A3000
, и она работает, просто позволяя%
символ. Поэтому вам нужно перечислить разрешенные символы в свойствеrequestPathInvalidCharacters
, например:%,&,*,\
. Мой текущая конфигурация:<httpRuntime targetFramework="4.6.1" requestPathInvalidCharacters="%" />
Править 2:
Я сделал некоторые дополнительные исследования и нашли ответ на MVC4 с маршрутом вызова WebAPI ASP.net с файл-имя. Простое решение-добавить свойство
runAllManagedModulesForAllRequests
в раздел modules в web config. Если вы проверяете принятый ответ, вы можете попытаться точно настроить решение, чтобы уменьшить влияние запуска всех управляемых модулей.Чтобы закончить, вам нужно изменить следующие разделы. Я удалил только
:
из значения по умолчанию requestPathInvalidCharacters , который применяется к уже декодированному URL и не имеет ничего общего с%
символами в кодированном URL:<system.web> <httpRuntime requestPathInvalidCharacters="<,>,*,%,&,\,?"/> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true"> ... </modules> </system.webServer>
Попробуйте это 2 изменения в web.конфиг.
<system.web> <httpRuntime targetFramework="4.6" requestPathInvalidCharacters=""/> </system.web> ... <system.webServer> <handlers> ... <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/> </handlers>
Примечание: Я устанавливаю пустой список в requestPathInvalidCharacters и изменяю фильтр пути в обработчике на "*".