Je veux vérifier si une longue chaîne existe dans une colonne de ma base de données. La chaîne contient des espaces, des caractères spéciaux et des retours chariot / sauts de ligne.
Mon contrôleur ressemble à ceci
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; }
Et je l'ai appelé comme ça
[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); }
Mais la réponse revient avec 'Mauvaise demande'. La requête fonctionne bien pour les chaînes simples qui ne contiennent pas d'espaces ou d'autres caractères spéciaux.
Comment puis-je passer une longue chaîne complexe à mon contrôleur?
3 Réponses :
Tout d'abord, votre route semble erronée et elle devrait plutôt être
[Route("api/Reports/GetReportIfExists/{text}")]
Deuxièmement, sachez que chaque navigateur pose une restriction sur la longueur de l'URI et donc si votre entrée de chaîne est très longue, je suggérerais passez-le plutôt comme corps de requête
Asp.net renvoie 414 Request-URI Too Large pour une URL longue par défaut, pas 400. Et l'itinéraire de la question est OK, sémantiquement faux, mais devrait fonctionner
Supprimez donc fondamentalement le {text} de mon itinéraire et appelez simplement le contrôleur avec le corps de la requête défini sur mon gros texte. Décodez-le ensuite dans le contrôleur en utilisant quelque chose comme await Request.Content.ReadAsStringAsync ()?
Modifiez l'itinéraire vers ceci (supprimé / Value = {text})
<requestLimits maxQueryString="32768"/>
et remplacez la méthode appelée par
var builder = new UriBuilder("http://localhost/myAPI/api/Reports/GetReportIfExists?text=" + WebUtility.HtmlEncode(reporttext));
Car URL a une longueur limite dont vous devrez peut-être mettre à jour dans web.config
[ResponseType(typeof(ReportsDTO.ReportDTO))] [Route("api/Reports/GetReportIfExists")] public IHttpActionResult GetReportIfExists(string text) { }
Vous voudrez probablement regarder
UrlEncode
au lieu deHtmlEncode
côté client. De plus,First
lève une exception lorsqu'aucun élément n'est trouvé, il ne retournera pasnull
.Pourquoi n'essayez-vous pas d'envoyer des données sous forme de données de formulaire avec [FromBody] au lieu de l'URL.
@KishanVaishnav oui c'est ce que j'ai décidé de faire à la fin, car ma chaîne dépasserait probablement la taille maximale autorisée.