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.