web-dev-qa-db-fra.com

Existe-t-il un moyen de forcer l’API Web ASP.NET à renvoyer du texte brut?

Je dois obtenir une réponse en texte brut à partir d'un contrôleur API Web ASP.NET.

J'ai essayé de faire une requête avec Accept: text/plain mais cela ne semble pas faire l'affaire ..__ De plus, la requête est externe et hors de mon contrôle. Ce que je voudrais accomplir est d’imiter l’ancienne méthode ASP.NET:

context.Response.ContentType = "text/plain";
context.Response.Write("some text);

Des idées?

EDIT, solution: Sur la base de la réponse de Aliostad, j'ai ajouté le formateur de texte WebAPIContrib , et l'initialisé dans Application_Start:

  config.Formatters.Add(new PlainTextFormatter());

et mon contrôleur a fini par quelque chose comme:

[HttpGet, HttpPost]
public HttpResponseMessage GetPlainText()
{
  return ControllerContext.Request.CreateResponse(HttpStatusCode.OK, "Test data", "text/plain");
}
114
Magnus Johansson

Hmmm ... Je ne pense pas que vous ayez besoin de créer un formateur personnalisé pour que cela fonctionne. Au lieu de cela, retournez le contenu comme ceci:

    [HttpGet]
    public HttpResponseMessage HelloWorld()
    {
        string result = "Hello world! Time is: " + DateTime.Now;
        var resp = new HttpResponseMessage(HttpStatusCode.OK);
        resp.Content = new StringContent(result, System.Text.Encoding.UTF8, "text/plain");
        return resp;
    }

Cela fonctionne pour moi sans utiliser un formateur personnalisé.

Si vous voulez explicitement créer une sortie et remplacer la négociation de contenu par défaut basée sur les en-têtes Accepter, vous ne voudrez pas utiliser Request.CreateResponse() car cela force le type mime. 

A la place, créez explicitement une nouvelle variable HttpResponseMessage et affectez le contenu manuellement. L'exemple ci-dessus utilise StringContent, mais il existe plusieurs autres classes de contenu disponibles pour renvoyer des données à partir de divers types/structures de données .NET.

215
Rick Strahl

Si vous cherchez simplement un formateur simple/texte sans ajouter de dépendances supplémentaires, cela devrait faire l'affaire.

public class TextPlainFormatter : MediaTypeFormatter
{
    public TextPlainFormatter()
    {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
    }

    public override bool CanWriteType(Type type)
    {
        return type == typeof(string);
    }

    public override bool CanReadType(Type type)
    {
        return type == typeof(string);
    }

    public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext transportContext)
    {
        return Task.Factory.StartNew(() => {
            StreamWriter writer = new StreamWriter(stream);
            writer.Write(value);
            writer.Flush();
        });
    }

    public override Task<object> ReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, IFormatterLogger formatterLogger)
    {
        return Task.Factory.StartNew(() => {
            StreamReader reader = new StreamReader(stream);
            return (object)reader.ReadToEnd();
        });
    }
}

N'oubliez pas de l'ajouter à votre configuration d'API Web globale.

config.Formatters.Add(new TextPlainFormatter());

Maintenant, vous pouvez passer des objets de chaîne à 

this.Request.CreateResponse(HttpStatusCode.OK, "some text", "text/plain");
14
Despertar
  • Faites attention de ne pas utiliser le contexte dans l'API Web ASP.NET, sinon vous serez tôt ou tard désolé. La nature asynchrone de l’API Web ASP.NET fait de l’utilisation de HttpContext.Current un passif.
  • Utilisez un formateur de texte brut et ajoutez-le à vos formateurs. Il y en a des dizaines autour. Vous pouvez même écrire le vôtre facilement. WebApiContrib en a un.
  • Vous pouvez le forcer en définissant l'en-tête de type de contenu sur httpResponseMessage.Headers sur text/plain dans votre contrôleur, à condition que vous ayez enregistré un formateur de texte brut.
12
Aliostad

Lorsque Accept: text/plain ne fonctionne pas, il n'y a pas de formateur enregistré pour les types mime de texte.

Vous pouvez vous assurer qu'il n'y a pas de formateurs pour le type mime spécifié en obtenant la liste de tous les formateurs pris en charge à partir de la configuration du service.

Créez un formateur de type de média très simple prenant en charge les types mime de texte.

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

6
Regfor

Pour le noyau .net:

[HttpGet("About")]
public ContentResult About()
{
    return Content("About text");
}

https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/formatting

2
rook

Une extension comme la suivante peut réduire le nombre de lignes et embellir votre code:

public static class CommonExtensions
{
    public static HttpResponseMessage ToHttpResponseMessage(this string str)
    {
        var resp = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(str, System.Text.Encoding.UTF8, "text/plain")
        };

        return resp;
    }
}


Vous pouvez maintenant utiliser l’extension définie dans votre Web API:

public class HomeController : ApiController
{
    [System.Web.Http.HttpGet]
    public HttpResponseMessage Index()
    {
        return "Salam".ToHttpResponseMessage();
    }
}


En routant {DOMAIN}/api/Home/Index, vous pouvez voir le texte brut suivant:

MyPlainTextResponse

0
Siyavash Hamdi