İçerik HttpResponseMessage nesnesine yerleştirilsin mi?


180

Birkaç ay önce Microsoft, HttpResponseMessage sınıfını değiştirmeye karar verdi. Daha önce, sadece bir veri türünü yapıcıya aktarabilir ve sonra mesajı bu verilerle döndürebilirsiniz, ancak artık veremezsiniz.

Şimdi, iletinin içeriğini ayarlamak için Content özelliğini kullanmanız gerekir. Sorun şu HttpContent türü ve ben bir dizeyi örneğin HttpContent dönüştürmek için bir yol bulamıyorum olmasıdır.

Bu sorunla nasıl başa çıkılacağını bilen var mı? Çok teşekkürler.

Yanıtlar:



135

Yanıtı Request.CreateResponse kullanarak oluşturmalısınız :

HttpResponseMessage response =  Request.CreateResponse(HttpStatusCode.BadRequest, "Error message");

Nesneleri yalnızca string'leri değil CreateResponse'ye aktarabilirsiniz ve isteğin Accept başlığına göre bunları serileştirir. Bu, manuel olarak bir formatlayıcı seçmekten kurtarır.


Otomatik olarak içerik türleri ile çalışır, böylece ekstra kod olmadan xml / json yapabilirsiniz

CreateErrorResponse()Yanıtın bu yanıt örneğinde olduğu gibi bir hata olup olmadığını aramak daha doğru olur diye düşünüyorum . Deneme-yakalamamın içinde kullanıyorum: this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "message", exception); Ve, ekstra maskaralık olmadan, arayanın Accept başlığına saygı duymaktan endişe duyuyorsanız, bu doğru cevaptır. (Ve WebAPI kullanıyorsunuz)
JMD

2
@FlorinDumitrescu Onun amacı, SADECE miras aldığınızda işe yaradığıydı ApiController. ControllerBunun yerine yalnızca miras HttpResponseMessage msg = new HttpResponseMessage(); msg.Content = new StringContent("hi"); msg.StatusCode = HttpStatusCode.OK;
alıyorsanız

64

Görünüşe göre bunu yapmanın yeni yolu burada detaylandırılmıştır:

http://aspnetwebstack.codeplex.com/discussions/350492

Henrik'i alıntılamak için,

HttpResponseMessage response = new HttpResponseMessage();

response.Content = new ObjectContent<T>(T, myFormatter, "application/some-format");

Yani temelde, görünüşe göre bir HttpContent nesnesi olarak döndürülebilen bir ObjectContent türü oluşturmak zorunda.


31
Benim formatter nedir
Greg Z.

1
@ user1760329 new JsonMediaTypeFormatter();, biçiminize bağlı olarak bir veya benzeri olur
John

1
ObjectContentbulunamadı, WCF
Medet Tleukabiluly

2
Bunu "bunu yapmanın yeni yolu" olarak nitelendirmem - referansta bulunduğunuz makalede, "kullanmak istediğiniz [medya türü] biçimlendiricinin tam denetimi" olmasını istediğiniz bir alternatif olarak listeler
Bern

Teşekkürler @praetor. Bu bana çok yardımcı oldu
SO Kullanıcı

53

En kolay tek hat çözümü kullanmak

return new HttpResponseMessage( HttpStatusCode.OK ) {Content =  new StringContent( "Your message here" ) };

Serileştirilmiş JSON içeriği için:

return new HttpResponseMessage( HttpStatusCode.OK ) {Content =  new StringContent( SerializedString, System.Text.Encoding.UTF8, "application/json" ) };

IHttpActionResult, ResponseMessageResult dönüş türünü gerektirdiğinden bu benim için çalışmadı. Neyle sonuçlandığım için aşağıdaki cevabımı görün. Ayrıca, nashawn'ın JsonContent (StringContent temel sınıfından türetildiği gibi) faktör yaptı.
Adam Cox

1
Sadece HttpResponseMessage'ı sarın: return new ResponseMessageResult (yeni HttpResponseMessage (HttpStatusCode.OK) {new StringContent ("Mesajınız buraya")}); :)
Simon Mattes

41

Herhangi bir T nesnesi için şunları yapabilirsiniz:

return Request.CreateResponse<T>(HttpStatusCode.OK, Tobject);

5
Dışında Requestyalnızca CreateResponsemiras alıyorsanız bir yöntemle kullanılabilir ApiController. Kullanıyorsa çalışmaz Controller.
vapcguy

15

Kendi özel içerik türlerinizi oluşturabilirsiniz. Örneğin, biri Json içeriği için, diğeri Xml içeriği için (daha sonra bunları HttpResponseMessage.Content öğesine atayın):

public class JsonContent : StringContent
{
    public JsonContent(string content)
        : this(content, Encoding.UTF8)
    {
    }

    public JsonContent(string content, Encoding encoding)
        : base(content, encoding, "application/json")
    {
    }
}

public class XmlContent : StringContent
{
    public XmlContent(string content) 
        : this(content, Encoding.UTF8)
    {
    }

    public XmlContent(string content, Encoding encoding)
        : base(content, encoding, "application/xml")
    {
    }
}

çok temiz ve temiz bir uygulama.
Sam

3

Simon Mattes'in cevabından esinlenerek, IHttpActionResult gerekli ResponseMessageResult dönüş türünü karşılamam gerekiyordu. Ayrıca nashawn'ın JsonContent kullanarak, ben sona erdi ...

        return new System.Web.Http.Results.ResponseMessageResult(
            new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
            {
                Content = new JsonContent(JsonConvert.SerializeObject(contact, Formatting.Indented))
            });

Nashawn'ın JsonContent için verdiği cevaba bakınız.


string enterpolasyon gereksiz görünüyor
Igor Pashchuk

0

Hiç şüphesiz Florin haklısın. Bu proje üzerinde çalışıyordum ve şu kod parçasını buldum:

product = await response.Content.ReadAsAsync<Product>();

Şununla değiştirilebilir:

response.Content = new StringContent(string product);

1
Bu cevap soru ile ilgili görünmüyor ve bir nesneden (Ürün) bir dizeye nasıl
geçileceğini göstermiyor
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.