1
votes

Requête incorrecte lors de la tentative de soumission d'une longue chaîne à la méthode de contrôleur Asp.Net Web Api 2

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 commentaires

Vous voudrez probablement regarder UrlEncode au lieu de HtmlEncode côté client. De plus, First lève une exception lorsqu'aucun élément n'est trouvé, il ne retournera pas null .


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.


3 Réponses :


1
votes

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


2 commentaires

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 ()?



1
votes

Doit être utilisé WebUtility.UrlEncode au lieu de WebUtility.HtmlEncode .


0 commentaires

1
votes

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)
    {

    }


0 commentaires