ASP.NET Web API에서 HTML 반환


120

ASP.NET MVC Web API 컨트롤러에서 HTML을 반환하는 방법은 무엇입니까?

아래 코드를 시도했지만 Response.Write가 정의되지 않았기 때문에 컴파일 오류가 발생했습니다.

public class MyController : ApiController
{
    [HttpPost]
    public HttpResponseMessage Post()
    {
        Response.Write("<p>Test</p>");
        return Request.CreateResponse(HttpStatusCode.OK);
    }
 }

4
HTML을 반환하려는 경우 WebAPI를 사용하는 이유는 무엇입니까? 이것은 ASP.NET MVC 및 ASP.NET WebForms의 용도입니다.
Stilgar 2014

감사합니다, 훌륭합니다. 컨트롤러를 일반 컨트롤러로 변경했습니다.
Andrus

18
@Stilgar 한 가지 이유는 그가 MVC 스택을 사용하지 않고 렌더링 엔진도 사용하지 않지만 여전히 일부 Html에 서버 파사드를 제공하기를 원했기 때문일 수 있습니다. 사용 사례는 이후 단계에서 모든 것을 렌더링하는 클라이언트 측 템플릿 엔진과 함께 일부 Html을 제공하는 Web Api가있을 수 있습니다.
Patrick Desjardins 2015 년

3
내가 만난 또 다른 유스 케이스는 사용자가 링크를 클릭하면 이메일을 통해 제공 할 때 계정 생성 확인에 대한 피드백을 제공하는 HTML 페이지를 반환 @Stilgar
wiwi

답변:


257

ASP.NET Core. 접근 방식 1

컨트롤러가 확장 ControllerBase되거나 방법 Controller을 사용할 수있는 경우 Content(...):

[HttpGet]
public ContentResult Index() 
{
    return base.Content("<div>Hello</div>", "text/html");
}

ASP.NET Core. 접근법 2

Controller클래스에서 확장하지 않기로 선택한 경우 다음을 새로 만들 수 있습니다 ContentResult.

[HttpGet]
public ContentResult Index() 
{
    return new ContentResult 
    {
        ContentType = "text/html",
        Content = "<div>Hello World</div>"
    };
}

레거시 ASP.NET MVC 웹 API

미디어 유형이있는 문자열 콘텐츠 반환 text/html:

public HttpResponseMessage Get()
{
    var response = new HttpResponseMessage();
    response.Content = new StringContent("<div>Hello World</div>");
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
    return response;
}

1
ASP.NET MVC Core HttpResponseMessage에서 지원되지 않음
Parshuram Kalvikatte 2016

@Parshuram 방금 귀하의 진술을 확인했습니다. ASP.NET Core에서 HttpResponseMessage를 사용할 수 있습니다. System.Net.Http 아래에 있습니다.
Andrei

ohk 감사하지만 지금은 MediaTypeHeaderValue은 지원하지 않는
Parshuram Kalvikatte

3
ASP.NET MVC 5를 사용하여이 작업을 수행하면 응답을받습니다. HTML 콘텐츠가 다시 표시되지 않습니다. 내가받은 모든 것은 "StatusCode : 200, ReasonPhrase : 'OK', 버전 : 1.1, Content : System.Net.Http.StringContent, Headers : {Content-Type : text / html}"
guyfromfargo

@guyfromfargo [Produces]접근 방식 을 시도해 보셨습니까 ?
Andrei

54

AspNetCore 2.0부터이 경우 특성 ContentResult대신 사용 하는 것이 좋습니다 Produce. 참조 : https://github.com/aspnet/Mvc/issues/6657#issuecomment-322586885

이것은 직렬화 나 콘텐츠 협상에 의존하지 않습니다.

[HttpGet]
public ContentResult Index() {
    return new ContentResult {
        ContentType = "text/html",
        StatusCode = (int)HttpStatusCode.OK,
        Content = "<html><body>Hello World</body></html>"
    };
}

4
2.0에서 전혀 작동하지 않는 "produces"답변을 얻을 수는 없었지만 제대로 작동합니다.
philw

파일에서 html을 표시하려면 "var content = System.IO.File.ReadAllText ("index.html ");"을 추가하십시오.
Pavel Samoylenko

4
네, ASP.NET Core 2.0을 사용하고 있다면 이것이 갈 길입니다!
James Scott

HTML 파일이 로컬 디렉토리에 있고 CSS, js도 링크되어 있다면 어떻게 될까요? 그러면 파일을 어떻게 제공합니까?
Lingam

Razor Pages의 경우 ContentResult를 직접 만드는 대신 PageModel Content () 메서드를 호출 할 수 있습니다. 컨트롤러에서도이 기능을 사용할 수 있는지 잘 모르겠습니다.
carlin.scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.