ASP.NET Web APIコントローラーからプレーンテキストで応答を取得する必要があります。
Accept: text/plain
でリクエストを実行しようとしましたが、うまくいかないようです。その上、リクエストは外部のものであり、私の制御の範囲外です。私が達成することは、古いASP.NETの方法を模倣することです:
context.Response.ContentType = "text/plain";
context.Response.Write("some text);
何か案は?
EDIT、solution:Aliostadの回答に基づいて、 WebAPIContrib テキストフォーマッターを追加し、Application_Startで初期化しました:
config.Formatters.Add(new PlainTextFormatter());
そして私のコントローラーは次のようなものになりました:
[HttpGet, HttpPost]
public HttpResponseMessage GetPlainText()
{
return ControllerContext.Request.CreateResponse(HttpStatusCode.OK, "Test data", "text/plain");
}
うーん...私はあなたがこの仕事をするためにカスタムフォーマッタを作成する必要はないと思います。代わりに、次のようなコンテンツを返します。
[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;
}
これは、カスタムフォーマッタを使用せずに機能します。
明示的に出力を作成し、Acceptヘッダーに基づいてデフォルトのコンテンツネゴシエーションをオーバーライドする場合、MIMEタイプを強制するため、Request.CreateResponse()
は使用しません。
代わりに、新しいHttpResponseMessage
を明示的に作成し、コンテンツを手動で割り当てます。上記の例ではStringContent
を使用していますが、さまざまな.NETデータ型/構造からデータを返すために利用できるコンテンツクラスは他にも多数あります。
追加の依存関係を追加せずに単純なプレーン/テキストフォーマッターを探しているだけなら、これでうまくいくはずです。
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();
});
}
}
グローバルWeb API設定に追加することを忘れないでください。
config.Formatters.Add(new TextPlainFormatter());
これで、文字列オブジェクトを
this.Request.CreateResponse(HttpStatusCode.OK, "some text", "text/plain");
HttpContext.Current
の使用が不利になります。httpResponseMessage.Headers
のコンテンツタイプヘッダーをtext/plain
に設定することで強制できます。Accept:text/plainが機能しない場合、テキストMIMEタイプ用の登録済みフォーマッターはありません。
サービス構成からサポートされているすべてのフォーマッターのリストを取得することにより、指定されたMIMEタイプのフォーマッターがないことを確認できます。
テキストMIMEタイプをサポートする非常に簡単なメディアタイプフォーマッタを作成します。
http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
.netコアの場合:
[HttpGet("About")]
public ContentResult About()
{
return Content("About text");
}
https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/formatting
次のような拡張機能を使用すると、行数を減らしてコードを美しくすることができます。
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;
}
}
これで、Web API
で定義された拡張機能を使用できます。
public class HomeController : ApiController
{
[System.Web.Http.HttpGet]
public HttpResponseMessage Index()
{
return "Salam".ToHttpResponseMessage();
}
}
{DOMAIN}/api/Home/Index
をルーティングすると、次のプレーンテキストを表示できます。
MyPlainTextResponse