调用ASP.NET MVC Web API遇Error 404.15:长字符串POST请求失败
POST请求超长字符串参数返回404.15错误的问题与解决
向Web API发送POST请求时发现,当字符串参数长度达到约20000字符时会返回Error 404.15错误,短字符串则请求可正常执行。查阅相关资料尝试解决未果,附上原API及客户端请求代码求助:
原API代码
[Route("InsertData")] [AcceptVerbs("GET", "POST", "PUT")] public IActionResult InsertData(string Char_2000,string Char_1000) { try { returnAuthNumber = _myRepository.InsertData(Char_2000, Char_1000, if (returnAuthNumber == null) throw new NullReferenceException("Data could not loaded"); } catch (Exception ex) { _logger.LogError(ex.ToString()); _logger.LogError(ex.StackTrace); return Problem(statusCode: 500, detail: ex.Message); } return Ok(returnAuthNumber); }
原客户端请求代码(短字符串时可正常运行)
public bool Post<T>(Controller mvcContrllr, string postURLString, string getURLString, string authToken, Dictionary<string, string> param = null) { var token = authToken; var url = System.Configuration.ConfigurationManager.AppSettings["ApiUrl"] + this.BuildCompleteUri(postURLString, param); var request = new HttpRequestMessage(HttpMethod.Post, this.BuildCompleteUri(url, param)); var client = new HttpClient(); // client.BaseAddress = new Uri(GlobalVariables.apiUrl); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); HttpResponseMessage response = client.SendAsync(request).Result; if (response.IsSuccessStatusCode) { return true; } return false; }
更新
已根据社区建议解决问题,附上修正后的代码供参考:
核心修改:客户端改用复杂类型(Class)传递参数,API端修改为接收带[FromBody]特性的复杂类型参数(默认API从查询字符串接收简单类型,从请求体接收复杂类型)。
修正后的客户端请求代码
public List<T> Post<T>(Controller mvcContrllr, string postURLString, string getURLString, string authToken, MyClass myclass, Dictionary<string, string> param = null) { var token = authToken; var url = System.Configuration.ConfigurationManager.AppSettings["ApiUrl"] + postURLString; HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); var urlParm = url; HttpResponseMessage response = client.PostAsJsonAsync(urlParm, myClass).Result; response.EnsureSuccessStatusCode(); if (response.IsSuccessStatusCode) { var content = response.Content.ReadAsStringAsync(); content.Wait(); var items = JsonConvert.DeserializeObject<List<T>>(content.Result); return items; } return null; }
修正后的API代码
[Route("InsertTAData")] [AcceptVerbs("GET", "POST", "PUT")] public IActionResult InsertData([FromBody] Myclass myClass) { try { returnAuthNumber = _myRepository.InsertData(myClass); if (returnAuthNumber == null) throw new NullReferenceException("Data could not loaded"); } catch (Exception ex) { _logger.LogError(ex.ToString()); _logger.LogError(ex.StackTrace); return Problem(statusCode: 500, detail: ex.Message); } return Ok(returnAuthNumber); }
内容的提问来源于stack exchange,提问作者Jashvita
相关产品推荐
相关产品推荐

