Я просто добавляю следующее в класс App_Start / WebApiConfig.cs
в проекте MVC Web API.
config.Formatters.JsonFormatter.SupportedMediaTypes
.Add(new MediaTypeHeaderValue("text/html") );
Это гарантирует, что вы получите json для большинства запросов, но вы можете получить xml
при отправке text/xml
.
Если вам нужно иметь ответ Content-Type
как application/json
, пожалуйста, проверьте ответ Тодда ниже .
NameSpace
использует System.Net.Http.Headers
;
Можно только сказать, содержит ли текущий поток нормальную блокировку ( Thread.holdsLock(Object)
). Вы не можете получить ссылку на поток, который имеет блокировку без собственного кода.
Однако при выполнении чего-либо сложного с поточной обработкой Вы, вероятно, хотите ознакомить себя с java.util.concurrent пакетами. ReentrantLock
действительно позволяет Вам получать его владельца (но это - защищенный метод, таким образом, необходимо было бы расширить это). В зависимости от Вашего приложения может случиться так, что при помощи пакетов параллелизма, Вы найдете, что не должны получать владельца блокировки, в конце концов.
существуют непрограммируемые методы для нахождения владельцев блокировки, таких как передача сигналов, чтобы о JVM выпустила дамп потока к stderr, которые полезны для определения причины мертвых блокировок.
От 1,6, можно использовать JMX, чтобы сделать все виды интересных вещей включая нахождение сохраненных блокировок. Вы не можете получить фактический объект, но Вы действительно получаете класс и значение хэш-функции идентификационных данных (который не уникален).
Выполненный jconsole. Это включено в SDK Java и выполняется из командной строки. Я не уверен, что ОС Вы используете, но на окнах можно просто передать ее PID процесса Java. Это должно помочь Вам найти поток, который вызывает проблему. Или, можно использовать коммерческого профилировщика как YourKit или любое число других профилировщиков.
В 1,5, можно найти все потоки и получить каждое состояние, например, как это:
Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
for (Map.Entry<Thread, StackTraceElement[]> threadEntry : map.entrySet()) {
log.info("Thread:"+threadEntry.getKey().getName()+":"+threadEntry.getKey().getState());
for (StackTraceElement element : threadEntry.getValue()) {
log.info("--> "+element);
}
}
Thread.getState дает Вам информацию о том, заблокирован ли поток, ОЖИДАЯ и т.д., см. jdk api ThreadState
Вы можете получить доступ к блокировкам, удерживаемым потоками с отражением. Это работает только с java 1.6.
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] ti = bean.getThreadInfo(bean.getAllThreadIds(), true, true);
На каждом из этих объектов ThreadInfo есть объекты LockInfo, для которых вы можете использовать identityHashCode для сравнения с рассматриваемой блокировкой.