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
UrlEncodeau lieu deHtmlEncodecôté client. De plus,Firstlè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.