ID 参数中带有反斜杠 (%2f) 的 WebApi 导致 404 未找到

Dom*_*ton 5 c# asp.net-web-api

我正在使用包含 / (%2f) 的参数调用 WebAPI 方法。如果我用没有这个字符的参数来调用它,它就可以正常工作。

按照此链接Escape characters in WebApi call中的建议,我尝试了以下操作,但没有任何区别。

<httpRuntime targetFramework="4.5.1" relaxedUrlToFileSystemMapping="true"/>
Run Code Online (Sandbox Code Playgroud)

我用来调用 WebAPI 方法的代码如下

var id = "AA/F1"; // This causes a problem of 404 not found
var workingId = "BB-F2"; // This works fine
using (var client = new HttpClient(new HttpClientHandler {AutomaticDecompression = DecompressionMethods.GZip}))
{
    var uri = new Uri(string.Format("http://[testServer]/[Controller]/Get/{0}", WebUtility.UrlEncode(id)));
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    var response = client.GetAsync(uri).GetAwaiter().GetResult();
    if (response.IsSuccessStatusCode)
        return JsonConvert.DeserializeObject<ReturnType>(response.Content.ReadAsStringAsync().GetAwaiter().GetResult());

    throw new Exception(response.ReasonPhrase);
}
Run Code Online (Sandbox Code Playgroud)

我只配置了一条路线 - 如下所示:

GlobalConfiguration.Configuration.Routes.MapHttpRoute("Default", "{controller}/{action}/{id}", new { id = RouteParameter.Optional });
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用 Fiddler 直接点击它并得到相同的错误。

S.D*_*Dav 2

你可以试试 var id = "AA%2fF1";

更新:

您还可以使用 Base64 编码,类似于:

var id = "AA/F1";
var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(id);
var encodedId = System.Convert.ToBase64String(plainTextBytes);
Run Code Online (Sandbox Code Playgroud)