ASP.NET Web API 컨트롤러에서 일반 텍스트로 응답을 받아야합니다.
나는 요청을 시도했지만 Accept: text/plain
트릭을 수행하지 않는 것 같습니다. 게다가 요청은 외부적이고 내 통제를 벗어났습니다. 내가 성취 할 것은 이전 ASP.NET 방식을 모방하는 것입니다.
context.Response.ContentType = "text/plain";
context.Response.Write("some text);
어떤 아이디어?
편집, 솔루션 : 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 헤더를 기반으로하는 기본 콘텐츠 협상을 재정의하려는 Request.CreateResponse()
경우 MIME 유형을 강제 하기 때문에 사용하지 않을 것 입니다.
대신 명시 적으로 새로 만들고 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();
});
}
}
글로벌 웹 API 구성에 추가하는 것을 잊지 마십시오.
config.Formatters.Add(new TextPlainFormatter());
이제 문자열 객체를
this.Request.CreateResponse(HttpStatusCode.OK, "some text", "text/plain");
답변
.net 코어의 경우 :
[HttpGet("About")]
public ContentResult About()
{
return Content("About text");
}
https://docs.microsoft.com/en-us/aspnet/core/mvc/models/formatting
답변
- ASP.NET Web API에서 컨텍스트를 사용하지 않도록주의하십시오. 그렇지 않으면 조만간 죄송합니다. ASP.NET Web API의 비동기 적 특성은 사용을 어렵게 만듭니다
HttpContext.Current
. - 일반 텍스트 포맷터를 사용하고 포맷터에 추가하십시오. 주변에 수십 개가 있습니다. 당신은 당신의 것을 쉽게 쓸 수도 있습니다. WebApiContrib 에는 하나가 있습니다.
- 일반 텍스트 포맷터를 등록한 경우 컨트롤러에서 콘텐츠 유형 헤더를
httpResponseMessage.Headers
로 설정하여 강제 할 수 있습니다text/plain
.
답변
Accept : text / plain이 작동하지 않으면 text MIME 유형에 대해 등록 된 포맷터가 없습니다.
서비스 구성에서 지원되는 모든 포맷터 목록을 가져 와서 지정된 MIME 유형에 대한 포맷터가 없는지 확인할 수 있습니다.
텍스트 MIME 유형을 지원하는 매우 간단한 미디어 유형 포맷터를 만듭니다.
http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
답변
다음과 같은 확장은 줄 수를 줄이고 코드를 아름답게 만들 수 있습니다.
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