Поместить контент в объект HttpResponseMessage?

Несколько месяцев назад Microsoft решила изменить класс HttpResponseMessage. До этого вы могли просто передать тип данных в конструктор, а затем вернуть сообщение с этими данными, но не более того.

Теперь вам нужно использовать свойство Content для установки содержимого сообщения. Проблема в том, что он имеет тип HttpContent, и я не могу найти способ преобразования строки, например, в HttpContent.

Кто-нибудь знает, как справиться с этой проблемой? Большое спасибо.

Ответ 1

Видимо, новый способ сделать это подробно здесь:

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

Процитирую Хенрика,

HttpResponseMessage response = new HttpResponseMessage();

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

Таким образом, в основном необходимо создать тип ObjectContent, который, очевидно, можно вернуть как объект HttpContent.

Ответ 2

Для строки, в частности, самым быстрым способом является использование конструктора StringContent

response.Content = new StringContent("Your response text");

Для других распространенных сценариев существует ряд дополнительных потомков класса HttpContent.

Ответ 3

Вы должны создать ответ, используя Request.CreateResponse:

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

Вы можете передавать объекты, а не только строки, CreateResponse, и он будет сериализовывать их на основе заголовка Accept запроса. Это избавит вас от ручного выбора форматера.

Ответ 4

Самое простое однолинейное решение - использовать

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

Для сериализованного содержимого JSON:

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

Ответ 5

Для любого объекта T, который вы можете сделать:

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

Ответ 6

Вы можете создавать собственные специализированные типы контента. Например, один для содержимого Json и один для содержимого Xml (затем просто назначьте их HttpResponseMessage.Content):

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")
    {
    }
}

Ответ 7

Вдохновленный ответом Саймона Мэттеса, мне нужно было удовлетворить IHttpActionResult требуемый тип возврата ResponseMessageResult. Также используя nashawn JsonContent, я закончил с...

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

Смотрите наш собственный ответ для JsonContent.

Ответ 8

Без сомнения, вы правы Флорин. Я работал над этим проектом и обнаружил, что этот фрагмент кода:

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

Может быть заменено на:

response.Content = new StringContent(string product);