Вернуть 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.
Stilgar
Спасибо отлично. Сменил контроллер на штатный.
Андрус
18
@Stilgar Одна из причин могла заключаться в том, что он не использует стек MVC, ни какой-либо движок рендеринга, но все же хочет предоставить серверный фасад для некоторого Html. Вариант использования может заключаться в том, что у вас есть веб-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>"
    };
}

Устаревший веб-API ASP.NET MVC

Вернуть строковое содержимое с типом мультимедиа 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 не поддерживает
Паршурам Калвикатте
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]подход?
Андрей
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>"
    };
}
KTCO
источник
4
Я не мог получить ответ «производит», чтобы он вообще работал на 2.0, однако это работает нормально.
philw
Если вы хотите показать html из файла, просто добавьте "var content = System.IO.File.ReadAllText (" index.html ");"
Павел Самойленко
4
Ага, если вы используете ASP.NET Core 2.0, это лучший вариант!
Джеймс Скотт
Что делать, если HTML-файл находится в локальном каталоге и к нему также привязаны css, js. Как же тогда подавать файл?
Лингам
Для Razor Pages вы можете вызвать метод PageModel Content () вместо непосредственного создания ContentResult. Я не уверен, что это доступно и для контроллеров.
carlin.scott