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理由の1つは、彼がMVCスタックを使用せず、レンダリングエンジンも使用していないが、一部のHtmlにサーバーファサードを提供したいと考えていることです。ユースケースとしては、後の段階ですべてをレンダリングするクライアント側のテンプレートエンジンを備えたHtmlを提供するWeb APIがある場合があります。
Patrick Desjardins、2015年

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>"
    };
}

レガシー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コアHttpResponseMessageでサポートされていません
Parshuram Kalvikatte 2016年

@Parshuram私はあなたの声明をチェックしました。ASP.NET CoreでHttpResponseMessageを使用できます。System.Net.Httpの下にあります。
Andrei

ありがとう、MediaTypeHeaderValueはサポートされていません
Parshuram Kalvikatte

3
ASP.NET MVC 5を使用してこれを行うと、応答が返されます。HTMLコンテンツが返されません。私が受け取るのは、「StatusCode:200、ReasonPhrase: 'OK'、バージョン:1.1、コンテンツ:System.Net.Http.StringContent、ヘッダー:{Content-Type:text / html}」
guyfromfargo

@guyfromfargo [Produces]アプローチしてみましたか?
Andrei

54

AspNetCore 2.0以降、この場合ContentResultProduce属性の代わりに使用することをお勧めします。参照: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で「プロデュース」の答えをまったく得ることができませんでしたが、これは問題なく動作します。
philw

ファイルからHTMLを表示する場合は、「var content = System.IO.File.ReadAllText( "index.html");」を追加するだけです。
Pavel Samoylenko、2018

4
はい、ASP.NET Core 2.0を使用している場合は、これが最適です。
ジェームズスコット

HTMLファイルがローカルディレクトリにあり、CSS、JSがリンクされている場合はどうなりますか。次に、ファイルをどのように提供しますか?
リンガム

Razorページの場合、ContentResultを直接作成する代わりに、PageModel Content()メソッドを呼び出すことができます。これがコントローラでも利用できるかどうかはわかりません。
carlin.scott
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.