Я хочу проверить, существует ли длинная строка в столбце в моей базе данных. Строка содержит пробелы, специальные символы и возврат каретки / перевод строки.

Мой контроллер выглядит так

    [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;
    }

Но ответ возвращается с «Плохой запрос». Запрос отлично работает для простых строк, которые не содержат пробелов или любых других специальных символов.

Как я могу передать сложную длинную строку моему контроллеру?

1
erotavlas 1 Май 2019 в 00:37

3 ответа

Лучший ответ

Прежде всего, ваш маршрут кажется неправильным, и он должен быть

[Route("api/Reports/GetReportIfExists/{text}")]

Во-вторых, имейте в виду, что каждый браузер накладывает ограничение на длину URI и, таким образом, если ваш ввод строки очень длинный, я бы посоветовал передать его как тело запроса, а не

1
Rahul 30 Апр 2019 в 21:41

Измените маршрут на этот (удалено / Значение = {текст})

 [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"/>
1
Hien Nguyen 1 Май 2019 в 09:13

Следует использовать WebUtility. .UrlEncode вместо WebUtility.HtmlEncode .

1
vladimir 30 Апр 2019 в 21:48