我想检查数据库中的列中是否存在长字符串。该字符串包含空格,特殊字符和回车符/换行符。
我的控制器看起来像这样
[ResponseType(typeof(ReportsDTO.ReportDTO))]
[Route("api/Reports/GetReportIfExists/Value={text}")]
public IHttpActionResult GetReportIfExists(string text)
{
Report report = db.Reports.Where(x => x.reporttext == text).First();
if (report == null)
{
return NotFound();
}
ReportsDTO.ReportDTO reportDTO = TranslateDTO.ConvertReportToDTO(report);
return Ok(reportDTO);
}
我这样称呼它
static async Task<string> GetReportAsync(string reporttext)
{
string responseString = string.Empty;
var builder = new UriBuilder("http://localhost/myAPI/api/Reports/GetReportIfExists/Value=" + WebUtility.HtmlEncode(reporttext));
builder.Port = -1;
string url = builder.ToString();
var response = client.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
responseString = response.Content.ReadAsStringAsync().Result;
}
return responseString;
}
但响应返回“错误请求”。 对于不包含空格或任何其他特殊字符的简单字符串,该请求可以正常工作。
如何将复杂的长字符串传递给控制器?
答案 0 :(得分:1)
首先,您的路线似乎有误,应该是
[Route("api/Reports/GetReportIfExists/{text}")]
第二,请注意,每个浏览器都会对URI的长度进行限制,因此,如果您的字符串输入很长,我建议将其作为请求正文传递
答案 1 :(得分:1)
应使用WebUtility.UrlEncode代替 WebUtility.HtmlEncode 。
答案 2 :(得分:0)
将路由更改为此(已删除/ Value = {text})
[ResponseType(typeof(ReportsDTO.ReportDTO))]
[Route("api/Reports/GetReportIfExists")]
public IHttpActionResult GetReportIfExists(string text)
{
}
并将调用的方法更改为
var builder = new UriBuilder("http://localhost/myAPI/api/Reports/GetReportIfExists?text=" + WebUtility.HtmlEncode(reporttext));
由于URL的长度限制,您可能需要在web.config中进行更新
<requestLimits maxQueryString="32768"/>