Повернути HTML з веб-API ASP.NET


120

Як повернути HTML з контролера веб-API ASP.NET MVC?

Я спробував код нижче, але отримав помилку компіляції, оскільки Response.Write не визначено:

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

4
Чому ви використовуєте WebAPI, якщо хочете повернути HTML? Я маю на увазі саме для цього ASP.NET MVC та ASP.NET WebForms.
Стілгар

Дякую, чудово. Я змінив контролер на звичайний контролер.
Андрус

18
@Stilgar Однією з причин могло бути те, що він не використовує стек MVC, ані будь-який механізм візуалізації, але все ж хоче надати фасад сервера якомусь Html. Випадком використання може бути те, що у вас є Web Api, який надає деякий Html з механізмом шаблону на стороні клієнта, який надасть все на подальшому етапі.
Патрік Дежардінс

3
@Stilgar Ще один випадок використання, з яким я стикався, - це повернення html-сторінки для надання зворотного зв’язку для підтвердження створення облікового запису, коли користувач натискає на посилання, яке ви надаєте електронною поштою
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>"
    };
}

Legacy ASP.NET MVC Web 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 Я щойно перевірив вашу заяву. Я можу використовувати HttpResponseMessage в ASP.NET Core. Він розташований під System.Net.Http.
Андрій

ой спасибі, але зараз MediaTypeHeaderValue не підтримує
Parshuram Kalvikatte

3
Коли я це роблю за допомогою ASP.NET MVC 5, я отримую відповідь. Я не повертаю жодного вмісту HTML. Я отримую лише "StatusCode: 200, ReasonPhrase:" OK ", Версія: 1.1, Зміст: System.Net.Http.StringContent, заголовки: {Тип вмісту: текст / html}"
guyfromfargo

@guyfromfargo Ви спробували [Produces]підходити?
Андрій

54

Починаючи з AspNetCore 2.0, рекомендується використовувати ContentResultзамість Produceатрибута в цьому випадку. Дивіться: https://github.com/aspnet/Mvc/isissue/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, але це працює чудово.
philw

Якщо ви хочете показати HTML з файлу, просто додайте "var content = System.IO.File.ReadAllText (" index.html ");"
Павло Самойленко,

4
Так, якщо ви використовуєте ASP.NET Core 2.0, це шлях!
Джеймс Скотт

Що робити, якщо HTML-файл знаходиться в локальному каталозі, і він також має css, js пов'язаний. Як ми тоді подаємо файл?
Лінгам

Для сторінок Razor ви можете зателефонувати за методом PageModel Content (), а не створювати ContentResult безпосередньо. Я не впевнений, чи це доступно і для контролерів.
carlin.scott
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.