Вызов getEntity приводит к сбою (с использованием odata4j в службе WCF)

Я пытаюсь использовать odata4j в своем приложении для Android для извлечения данных из БД, к которым можно получить доступ из службы WCF.

 ODataConsumer co = ODataConsumer.create("http://xxx.xx.xx.xxx:xxxx/Users");
 for(OEntity user : co.getEntities("Users").execute())
 {
      // do stuff
 }

Однако это падает при вызове getEntities. Я также пробовал множество других вызовов, таких как

 Enumerable<OEntity> eo = co.getEntities("Users").execute();            
 OEntity users = eo.elementAt(0);

Однако это также дает сбой в eo.elementAt(0).

Logcat ничего мне не говорит, и стек вызовов, кажется, приостановлен в ActivityThread.performLaunchActivity.

С другой стороны, ввод «http://localhost:xxxx/Users» в моем веб-браузере работает, как и ожидалось, и возвращает пользователей в мою БД в формате xml.

Любые идеи о том, как я могу отладить это?


person lost_bits1110    schedule 03.06.2011    source источник


Ответы (3)


Я предполагаю, что вызов должен быть:

ODataConsumer co = ODataConsumer.create("http://xxx.xx.xx.xxx:xxxx");
for(OEntity user : co.getEntities("Users").execute())
{
     // do stuff
}

create определяет службу, к которой вы хотите подключиться, но Users — это ресурс, который вы хотите запросить.

person Ladislav Mrnka    schedule 03.06.2011
comment
ах, глупый я - да, я пробовал это изначально. Я удалил «Пользователи» из вызова для создания, однако он все еще зависает на getEntities :( - person lost_bits1110; 03.06.2011
comment
Просто сначала проверьте - может ли ваше приложение для Android получить доступ к адресу? В противном случае вы можете использовать что-то вроде Fiddler и сравнить запрос из браузера и запрос из Android? - person Ladislav Mrnka; 03.06.2011
comment
да, если вместо этого я использую HttpGet, мой Android может получить доступ к адресу. К сожалению, Fiddler не показывает мне никаких новых элементов, когда я перехожу через цикл getEntities. - person lost_bits1110; 03.06.2011
comment
Ну просто глупая попытка. Что, если вы добавите косую черту в конце URL-адреса? - person Ladislav Mrnka; 03.06.2011
comment
попытался добавить завершающий '/' к URL-адресу в методе создания, к сожалению, пока не повезло - person lost_bits1110; 03.06.2011
comment
И что произойдет, если вы вызовете только co.getMetadata()? Тоже зависает? - person Ladislav Mrnka; 03.06.2011
comment
Сколько пользователей у вас на самом деле есть в вашей базе данных? Что произойдет, если вы просто попытаетесь получить одного пользователя? - person Ladislav Mrnka; 03.06.2011
comment
На данный момент у меня 2 пользователя. Я пытаюсь получить одного пользователя, используя что-то вроде: OEntity user = co.getEntity("Users", "1eb11842-6f04-4de2-9524-05ed836e3fa3").execute();, где вторым параметром является UserId, однако это также дает сбой. - person lost_bits1110; 03.06.2011
comment
К сожалению, logcat не отображает никаких ошибок, однако, глядя на представление переменных, я вижу «RuntimeException», «Ожидаемый статус 404, 200 или 204, найдено 400:\n‹?xml version=1.0 encoding=utf-8 standalone= да?›\r\n‹ошибка xmlns=schemas.microsoft.com/ado /2007/08/dataservices/metadata›\r\n ‹code›‹/code›\r\n ‹message xml:lang=en-US›Неверный запрос — ошибка в синтаксисе запроса.‹/message› \r\n‹/ошибка›' - person lost_bits1110; 03.06.2011
comment
Что ж, нам снова нужен Fiddler (вы настроили приложение Android для использования Fiddler в качестве http-прокси?). Если вы не можете использовать fiddler, попробуйте трассировку WCF — проверьте файл трассировки и найдите Действия действия процесса и в действии для входящего HTTP-запроса — он должен содержать URL-адрес. - person Ladislav Mrnka; 04.06.2011
comment
Спасибо за вашу помощь. Я попытался настроить Fiddler, но все еще ничего не вижу в эмуляторе Android. Я пытаюсь выполнить трассировку WCF и вижу HTTP-запрос, отправленный на xxx.xx.xx.xxx:xxxx/, а через несколько элементов я вижу "Вызов исключения". «Объект связи System.ServiceModel.Channels.TransportReplyChannelAcceptor+TransportReplyChannel нельзя использовать для связи, поскольку он был прерван». - person lost_bits1110; 04.06.2011
comment
Вы упомянули, что сервис работает из браузера, поэтому используйте его и проверьте различия между обработкой запросов Android и обработкой запросов браузера. - person Ladislav Mrnka; 04.06.2011
comment
о, да, я вижу разницу, в обоих я вижу как минимум два элемента Active Boundary. Однако в успешном случае между двумя последними сообщениями об «активной границе» я вижу «Началась запись элемента синдикации». Написание пункта синдикации завершено. Отправлено сообщение по каналу. Неудачный. Я ничего этого не вижу, только «От: Выполнить» System.Data.Services.IRequestHandler.ProcessRequestForMessage. - person lost_bits1110; 04.06.2011
comment
Таким образом, служба выходит из строя сразу же после получения запроса. На всякий случай - используете ли вы какую-либо безопасность/аутентификацию, включая аутентификацию на веб-сервере? - person Ladislav Mrnka; 04.06.2011
comment
Вы также можете включить передачу сведений об исключении из службы клиенту — стандарт includeExcpetionDetailInFaults (если вы используете WCF 4, просто добавьте его в поведение по умолчанию). - person Ladislav Mrnka; 04.06.2011
comment
В настоящее время я не использую безопасность\аутентификацию, и, к сожалению, добавление includeExceptionDetailInFaults в мой файл конфигурации приводит только к ошибке, когда я пытаюсь запустить службу: Инициализатор типа для «System.ServiceModel.Diagnostics.TraceUtility» вызвал исключение . - person lost_bits1110; 04.06.2011

Чтобы регистрировать все http-запросы/ответы:

ODataConsumer.dump.all(true);

URI, передаваемый вызову .create потребителя, должен быть корневым сервисом. например .create("http://xxx.xx.xx.xxx:xxxx/"); В противном случае ваш код выглядит нормально.

Обратите внимание, что Enumerable ведет себя как тип .net — перечисление откладывается до доступа. Если вы планируете индексировать результаты несколько раз, я бы посоветовал вам сначала вызвать .toList().

Дай мне знать, что ты узнаешь.

Надеюсь, это поможет,
- john

person John Spurlock    schedule 03.06.2011
comment
спасибо за ваш совет. Где регистрируются все http-запросы\ответы после ODataConsumer.dump.all(true)? Да, я изменил URL-адрес в своем методе создания, но он все равно вылетает :( - person lost_bits1110; 04.06.2011

Можете ли вы попробовать этот способ.

OEntity oEntity;     
         OQueryRequest<OEntity>  oQueryRequest=  oDataJerseyConsumer.getEntities(entityName);
         List<OEntity>  list=  oQueryRequest.execute().toList();

         for (OEntity o : list) {
                List<OProperty<?>> props = o.getProperties();
                for (OProperty<?> prop : props) {
                    System.out.println(prop.getValue().toString());

                }

        }
person user2248671    schedule 05.04.2013