[asp.net] ASP.NET Web API가 일반 텍스트를 반환하도록 강제하는 방법이 있습니까?

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


답변