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 9

2 ответа:

Согласно ответу MVC Web API routing терпит неудачу, когда url содержит закодированный амперсанд вам нужно удалить символы, которые вы считаете допустимыми из Свойства requestPathInvalidCharacters httpruntime:

<httpruntime requestvalidationmode="2.0">
             requestPathInvalidCharacters="*,:,&amp;,\"
             relaxedUrlToFileSystemMapping="true" />
Но гораздо безопаснее передавать эти параметры в виде строки запроса.

Редактировать:

Я проверил url-форму вашего вопроса http://localhost:3000/proxy/target/v1/urn%3Aparam%2Foutpu?domain=http%3A%2F%2Flocalhost%3A3000, и она работает, просто позволяя % символ. Поэтому вам нужно перечислить разрешенные символы в свойстве requestPathInvalidCharacters, например: %,&amp;,*,\. Мой текущая конфигурация:

<httpRuntime targetFramework="4.6.1" requestPathInvalidCharacters="%" />

Править 2:

Я сделал некоторые дополнительные исследования и нашли ответ на MVC4 с маршрутом вызова WebAPI ASP.net с файл-имя. Простое решение-добавить свойство runAllManagedModulesForAllRequests в раздел modules в web config. Если вы проверяете принятый ответ, вы можете попытаться точно настроить решение, чтобы уменьшить влияние запуска всех управляемых модулей.

Чтобы закончить, вам нужно изменить следующие разделы. Я удалил только : из значения по умолчанию requestPathInvalidCharacters , который применяется к уже декодированному URL и не имеет ничего общего с % символами в кодированном URL:

<system.web>
  <httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,\,?"/>
</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 и изменяю фильтр пути в обработчике на "*".