ApiController ile ham dizge nasıl döndürülür?


125

XML / JSON sunan bir ApiController'im var, ancak eylemlerimden birinin saf HTML döndürmesini istiyorum. Aşağıdakini denedim ama yine de XML / JSON döndürüyor.

public string Get()
{
    return "<strong>test</strong>";
}

Yukarıdakilerin döndürdüğü şey budur:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">&lt;strong&gt;test&lt;/strong&gt;</string>

Çevreleyen XML etiketleri bile olmadan yalnızca saf, çıkış karaktersiz metni döndürmenin bir yolu var mı (belki farklı bir dönüş türü eylem niteliği)?

Yanıtlar:


223

HttpResponseMessageİçerik üzerinde tam kontrole sahip olduğunuz Web Api eyleminizin geri dönmesini sağlayabilirsiniz . Sizin durumunuzda bir StringContent kullanabilir ve doğru içerik türünü belirtebilirsiniz:

public HttpResponseMessage Get()
{
    return new HttpResponseMessage()
    {
        Content = new StringContent(
            "<strong>test</strong>", 
            Encoding.UTF8, 
            "text/html"
        )
    };
}

veya

public IHttpActionResult Get()
{
    return base.ResponseMessage(new HttpResponseMessage()
    {
        Content = new StringContent(
            "<strong>test</strong>", 
            Encoding.UTF8, 
            "text/html"
        )
    });
}

Henüz denemedim ama merak ediyorum veri türünü html olarak ayarlasam işe yarayacak mı?
— adt

5
Hayır işe yaramayacak. Web API'sinde yalnızca yerleşik XML ve JSON biçimlendiricileri bulunur. Diğer her şey için kendi formatlayıcınızı oluşturmanız veya cevabımda gösterildiği gibi yöntemlerinden ham HttpResponseMessage'ları döndürmeniz gerekecektir.
— Darin Dimitrov

HttpResponseMessage, System.Net.Http ad alanında bulunur.
— James Lawruk

8

Başka bir olası çözüm. Web API 2'de base.Content () yöntemini kullandım APIController:

    public IHttpActionResult Post()
    {
        return base.Content(HttpStatusCode.OK, new {} , new JsonMediaTypeFormatter(), "text/plain");
    }

JSON içeriğini indirmeye devam ettiği bir IE9 hatasını aşmak için bunu yapmam gerekiyordu. Bu, XmlMediaTypeFormattermedya biçimlendiriciyi kullanarak XML türü veriler için de çalışmalıdır .

Umarım bu birine yardımcı olur.


OP bir html dizesi döndürmek istiyordu .. Böyle bir dizge nerede? ve JsonMediaTypeFormatter html'yi nasıl döndürebilir?
— 2019

4

Sadece return Ok(value)işe yaramayacak, olarak değerlendirilecek IEnumerable<char>.

Bunun yerine kullanın return Ok(new { Value = value })veya benzer.


0

Bir mvc denetleyici yönteminden aşağıdaki webapi2 denetleyici yöntemini çağırıyorum:

<HttpPost>
Public Function TestApiCall(<FromBody> screenerRequest As JsonBaseContainer) As IHttpActionResult
    Dim response = Me.Request.CreateResponse(HttpStatusCode.OK)
    response.Content = New StringContent("{""foo"":""bar""}", Encoding.UTF8, "text/plain")
    Return ResponseMessage(response)
End Function

Bunu asp.net sunucusundaki bu rutinden çağırıyorum:

Public Async Function PostJsonContent(baseUri As String, requestUri As String, content As String, Optional timeout As Integer = 15, Optional failedResponse As String = "", Optional ignoreSslCertErrors As Boolean = False) As Task(Of String)
    Return Await PostJsonContent(baseUri, requestUri, New StringContent(content, Encoding.UTF8, "application/json"), timeout, failedResponse, ignoreSslCertErrors)
End Function

Public Async Function PostJsonContent(baseUri As String, requestUri As String, content As HttpContent, Optional timeout As Integer = 15, Optional failedResponse As String = "", Optional ignoreSslCertErrors As Boolean = False) As Task(Of String)
    Dim httpResponse As HttpResponseMessage

    Using handler = New WebRequestHandler
        If ignoreSslCertErrors Then
            handler.ServerCertificateValidationCallback = New Security.RemoteCertificateValidationCallback(Function(sender, cert, chain, policyErrors) True)
        End If

        Using client = New HttpClient(handler)
            If Not String.IsNullOrWhiteSpace(baseUri) Then
                client.BaseAddress = New Uri(baseUri)
            End If

            client.DefaultRequestHeaders.Accept.Clear()
            client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
            client.Timeout = New TimeSpan(TimeSpan.FromSeconds(timeout).Ticks)

            httpResponse = Await client.PostAsync(requestUri, content)

            If httpResponse.IsSuccessStatusCode Then
                Dim response = Await httpResponse.Content.ReadAsStringAsync
                If Not String.IsNullOrWhiteSpace(response) Then
                    Return response
                End If
            End If
        End Using
    End Using

    Return failedResponse
End Function

0

WebAPI yerine MVC kullanıyorsanız, base.Content yöntemini kullanabilirsiniz:

return base.Content(result, "text/html", Encoding.UTF8);

-2

HTML'yi değil, API'lerimizden saf verileri döndürmeye ve verileri kullanıcı arayüzünde buna göre biçimlendirmeye çalışmalıyız, ancak belki şunları kullanabilirsiniz:

return this.Request.CreateResponse(HttpStatusCode.OK, 
     new{content=YourStringContent})

benim için çalışıyor


6
Bir şeyi kukla bir nesneye sarmak onu daha saf hale getirmez. HTML Eğer bir veri, saklamanın bir anlamı yok.
— Jouni Heikniemi

Web API'sinin fikri, verileri döndürmek ve gerekli HTML'yi eklemek için UI'yi terk etmektir, belki verilerin HTML olduğu bazı durumlara sahip olabiliriz, ancak bunun norm olmadığını düşünüyorum.
— user1075679
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.