我使用包含/(%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直接点击它并得到同样的错误。
答案 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))
检查这是否有帮助