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

时间:2017-03-31 11:44:23

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

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

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

<httpRuntime targetFramework="4.5.1" relaxedUrlToFileSystemMapping="true"/>

我用来调用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);
}

我只配置了一条路线 - 如此:

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

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

2 个答案:

答案 0 :(得分:1)

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

<强>更新

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

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

答案 1 :(得分:1)

您可以在发送之前对完整网址进行编码

WebUtility.UrlEncode(string.Format("http://[testServer]/[Controller]/Get/{0}", id))

检查这是否有帮助