Поместить контент в объект 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);