Запрос JayData oData с пользовательскими заголовками - ROUND 2

Несколько месяцев назад я работал над одним проектом WCF для Odata, и у меня возникли проблемы с анализом пользовательских заголовков для аутентификации токена (apiKey).

В то время, будучи довольно нубом (все еще я!), Я разместил этот SO вопрос: Запрос oData JayData с пользовательскими заголовками

Сегодня я работаю над новым проектом с сервером Jaydata Odata и клиентской библиотекой, и это:

 application.context.prepareRequest = function (r) {
     r[0].headers['apikey'] = '123456';
 };

работал хорошо, пока я не должен был сделать MERGE запрос. Я обнаружил, что каким-то образом MERGE-запрос переопределяет мои заголовки, поэтому я продолжил расследование.

Сначала кажется, что в oDataProvider.js (~ строка 617) в _saveRest Метод заголовки не наследуются:

request = {
   requestUri: this.providerConfiguration.oDataServiceHost + '/',
   headers: {
      MaxDataServiceVersion: this.providerConfiguration.maxDataServiceVersion
   }
};

но через несколько строк мы получим:

this.context.prepareRequest.call(this, requestData);

который "должен" назвать моим собственным prepareRequest, но не... Вместо этого он по-прежнему указывает на:

//Line 11302 jaydata.js
prepareRequest: function () { }, 

что, конечно, не делает... ничего! Достаточно забавно, когда вы выполняете простую GET один и тот же код предположительно на том же context экземпляр работает и указывает на мой prepareRequest переопределения.

Я могу с достаточной уверенностью утверждать, что каким-то образом контекст между GET/MERGE не совпадает. Я не могу видеть, однако, любое место, где context экземпляр переназначен.

У кого-нибудь есть подсказка?

PS: это НЕ CORS вопрос. Мои ОПЦИИ проходят нормально, и подача заголовков вручную в oDataProvider работает.

Больше

Я последовал примеру в разных контекстных случаях и нашел что-то интересное. призвание EntitySet.save() в конечном итоге вызывает EntityContext конструктор. увидеть след:

$data.Class.define.constructor (jaydata.js:10015)
EntityContext (VM110762:7)
Service (VM110840:8)
storeToken.factory (jaydata.js:14166)
$data.Class.define._getContextPromise (jaydata.js:13725)
$data.Class.define._getStoreContext (jaydata.js:13700)
$data.Class.define._getStoreEntitySet (jaydata.js:13756)
$data.Class.define.EntityInstanceSave (jaydata.js:13837)
$data.Entity.$data.Class.define.save (jaydata.js:9774)
(anonymous function) (app.js:162) // My save()

Это объясняет, почему я получаю два разных экземпляра...

мотыга

Замена prepareRequest Функция непосредственно в определении класса работает, но это ужасно!

сейчас я могу справиться с этим:

$data.EntityContext.prototype.prepareRequest = function (r) {
   r[0].headers['apikey'] = '12345';
}; 

Это работает нормально, если вам нужно общаться только с одной конечной точкой.

Последнее слово на основе моего опыта

Как бы мне ни нравились JayData, очевидно, что они создали монстра, и он выходит из их рук (плохой форум, нет сообщества, недокументировано,...).

Я выбрал JD, потому что я был ленив и хотел продолжать работать со своим старым WCF DataService. Переход на Web API показался мне неправильным или слишком большим для меня.

Также как разработчик.net мне нравилась строгая типизация моих сущностей и способность работать с конкретной моделью, созданной из инструментов JD. Однако, в конце концов, я добавил путаницу. Каждый раз, когда менялась моя серверная модель, мне приходилось извлекать новые метаданные и создавать новую модель entityModel.

В итоге я перешел на Web Api и перенес свой уровень обслуживания данных на Breeze. И серьезно! работать с ним проще простого!

Документация абсолютно блестящая, и здесь, на SO, вы всегда можете рассчитывать на Уорда или Джея Тарбанда, которые ответят с очень высоким профессионализмом.

В конце концов, я понимаю, что это должно быть скорее вики, чем вопрос.....

0 ответов

Другие вопросы по тегам