Возврат правильного формата осуществляется форматом медиа-типа. Как уже упоминалось, вы можете сделать это в классе WebApiConfig
:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
...
// Configure Web API to return JSON
config.Formatters.JsonFormatter
.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));
...
}
}
Для получения дополнительной информации проверьте:
В случае, если ваши действия возвращают XML (который это по умолчанию), и вам нужен только специальный метод для возврата JSON, вы можете использовать ActionFilterAttribute
и применить его к этому конкретному действию.
Атрибут фильтра:
public class JsonOutputAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
ObjectContent content = actionExecutedContext.Response.Content as ObjectContent;
var value = content.Value;
Type targetType = actionExecutedContext.Response.Content.GetType().GetGenericArguments()[0];
var httpResponseMsg = new HttpResponseMessage
{
StatusCode = HttpStatusCode.OK,
RequestMessage = actionExecutedContext.Request,
Content = new ObjectContent(targetType, value, new JsonMediaTypeFormatter(), (string)null)
};
actionExecutedContext.Response = httpResponseMsg;
base.OnActionExecuted(actionExecutedContext);
}
}
Применение к действию:
[JsonOutput]
public IEnumerable GetPersons()
{
return _repository.AllPersons(); // the returned output will be in JSON
}
Обратите внимание, что вы можете опустить слово Attribute
в декорации действия и использовать только [JsonOutput]
вместо [JsonOutputAttribute]
.
Большой вопрос. Я нашел этот статья, которая содержит блок-схемы и для типов значения и для ссылочных типов. Также посмотрите этот статья , в которой Ritcher заявляет:
[надрез] каждый массив имеет некоторую дополнительную служебную информацию, связанную с ним. Эта информация содержит разряд массива (количество размеров), нижние границы для каждого размера массива (почти всегда 0), и длина каждого размера. Издержки также содержат тип каждого элемента в массиве.
Один способ исследовать это состоит в том, чтобы посмотреть на код в WinDbg. Так, учитывая код ниже, давайте посмотрим, как это появляется на "куче".
var numbers = new Int32[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
первое, что нужно сделать состоит в том, чтобы определить местоположение экземпляра. Поскольку я сделал это локальным в Main()
, легко найти адрес экземпляра.
От адреса мы можем вывести фактический экземпляр, который дает нам:
0:000> !do 0x0141ffc0
Name: System.Int32[]
MethodTable: 01309584
EEClass: 01309510
Size: 52(0x34) bytes
Array: Rank 1, Number of elements 10, Type Int32
Element Type: System.Int32
Fields:
None
Это говорит нам, что это - наш массив Int32 с 10 элементами и общим размером 52 байтов.
Позволяют нам вывести память, где экземпляр расположен.
0:000> d 0x0141ffc0
0141ffc0 [84 95 30 01 0a 00 00 00-00 00 00 00 01 00 00 00 ..0.............
0141ffd0 02 00 00 00 03 00 00 00-04 00 00 00 05 00 00 00 ................
0141ffe0 06 00 00 00 07 00 00 00-08 00 00 00 09 00 00 00 ................
0141fff0 00 00 00 00]a0 20 40 03-00 00 00 00 00 00 00 00 ..... @.........
01420000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
01420010 10 6d 99 00 00 00 00 00-00 00 01 40 50 f7 3d 03 .m.........@P.=.
01420020 03 00 00 00 08 00 00 00-00 01 00 00 00 00 00 00 ................
01420030 1c 24 40 03 00 00 00 00-00 00 00 00 00 00 00 00 .$@.............
я вставил скобки для 52 байтов.
Редактирование: Забыл длину в первой регистрации.
список является немного неправильным, потому что, поскольку romkyns указывает, что экземпляр на самом деле начинается в адресе - 4, и первым полем является Syncblock.
Объект массива должен был бы сохранить, сколько размеров он имеет и длина каждого размера. Таким образом, существует по крайней мере еще один элемент данных для добавления к модели
Большой вопрос! Я хотел видеть его для меня, и это казалось хорошей возможностью испытать CorDbg.exe...
кажется, что для простых целочисленных массивов, формат:
ssssllll000011112222....nnnn0000
, где s является синхронизирующим блоком, l длина массива и затем отдельные элементы. Кажется, что существует наконец 0 в конце, я не уверен, почему это.
Для многомерных массивов:
ssssttttl1l1l2l2????????
000011112222....nnnn000011112222....nnnn....000011112222....nnnn0000
то, где s является синхронизирующим блоком, t общее число элементов, l1 длина первого размера, l2 длина второго размера, затем два, обнуляет?, сопровождаемый всеми элементами последовательно и наконец нулем снова.
Объектные массивы рассматривают как целочисленный массив, содержание является ссылками на этот раз. Зубчатые массивы являются объектными массивами, где ссылки указывают на другие массивы.