WebApi代理为具有无效字符的URL抛出404

时间:2017-05-17 14:50:52

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

我使用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

在web.config上尝试了一些建议,但没有:

<system.web>
  <httpRuntime targetFramework="4.6" requestPathInvalidCharacters=""/>
  <pages validateRequest="false" />
</system.web>

所有其他WebApi端点都使用如下的Global.asax:

public class Global : System.Web.HttpApplication
{
  protected void Application_Start(object sender, EventArgs e)
  {
    GlobalConfiguration.Configure(Config.WebApiConfig.Register);
  }
}

Config.WebApiConfig:

public class WebApiConfig
{
  public static void Register(HttpConfiguration config)
  {
    config.MapHttpAttributeRoutes();
  }
}

2 个答案:

答案 0 :(得分:5)

根据答案MVC WEB API routing fails when url contains encoded ampersand,您需要从requestPathInvalidCharacters的{​​{1}}属性中删除您认为有效的字符:

httpruntime

但将这些参数作为查询字符串传递更安全。

修改

我已经在您的问题<httpruntime requestvalidationmode="2.0"> requestPathInvalidCharacters="*,:,&amp;,\" relaxedUrlToFileSystemMapping="true" /> 中测试了网址,并且只需允许http://localhost:3000/proxy/target/v1/urn%3Aparam%2Foutpu?domain=http%3A%2F%2Flocalhost%3A3000字符即可。因此,您需要在%属性中列出允许的字符,例如:requestPathInvalidCharacters。我目前的配置是:

%,&amp;,*,\

编辑2:

我做了一些研究,找到了ASP.net MVC4 WebApi route with file-name in it的答案。简单的解决方案是将<httpRuntime targetFramework="4.6.1" requestPathInvalidCharacters="%" /> 属性添加到Web配置中的模块部分。如果您检查已接受的答案,则可以尝试微调解决方案以减少运行所有托管模块的影响。

总而言之,您需要修改以下部分。我仅从requestPathInvalidCharacters的默认值中删除了runAllManagedModulesForAllRequests,该值适用于已解码的网址,并且与编码网址中的:字符无关:

%

答案 1 :(得分:1)

在web.config中尝试这两项更改。

<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中设置了一个空列表,并将处理程序中的路径过滤器更改为&#34; *&#34;。