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");
}
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.
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");
HttpContext.Current
un passif.httpResponseMessage.Headers
sur text/plain
dans votre contrôleur, à condition que vous ayez enregistré un formateur de texte brut.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
Pour le noyau .net:
[HttpGet("About")]
public ContentResult About()
{
return Content("About text");
}
https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/formatting
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