/ / Як змінити кореневу службу OData uri - .net, asp.net-web-api, метадані, odata

Як змінити кореневий каталог OData uri - .net, asp.net-web-api, метадані, odata

У мене є служба OData. Основним кореневим урі є: http://example.com/odata/v1. Я виставляю його через інший сайт: http://apigee.com/odata/v1. Цей сайт перенаправляє всі запити на example.com і має механізм підтвердження клієнта.

Я використовую бібліотеку клієнтів OData .NET для виклику служби. Кожен простий запит працює чудово:

GET http://apigee.com/odata/v1/Activities(1)
GET http://apigee.com/odata/v1/AppPackages(1)

Відповідний код .NET виглядає так:

var container = new Container("http://apigee.com/odata/v1");
var activity = container.Activities.Where(p => p.id == "1").SingleOrDefault();
var apppackage = container.AppPackages.Where(p => p.id == "1").SingleOrDefault();

Коли я хочу додати зв’язок між цими двома об'єктами, я стикаюся з проблемою "Несанкціоноване". Код такий:

 container.AddLink(act, "AppPackages", package);
container.SaveChanges();

І генерований http-запит:

POST http://example.com/odata/v1/Activities(1)/$links/AppPackages

AddLink дзвонить безпосередньо на "http://example.com/odata/v1" замість "http://apigee.com/odata/v1". Це не проходить через перевірку клієнта на apigee.com, тому example.com відкидає це. Я думаю, причина в" odata.metadata ". Коли я це роблю

GET http://mysite.io/odata/v1/Activities(1)

Повернена інформація:

{
"odata.metadata":"http://example.com/odata/v1/$metadata#Activities/@Element",
...
}

Цікаво, чи є спосіб, щоб я повернувся "http://apigee.com/odata/v1"Тут. Або будь-яким способом, який може вирішити цю проблему. Дякую велике.

Відповіді:

0 для відповіді № 1

Цей Url контролюється MetadataDocumentUri з ODataMessageWriterSettings.

Якщо ви використовуєте ODataLib безпосередньо, ви можете спробувати:

settings.SetMetadataDocumentUri(new Uri("http://apigee.com/odata/v1/$metadata"));

Якщо ви використовуєте службу даних даних WCF, ви можете спробувати замінити метод OnStartProcessingRequest на вашій DataService:

protected override void OnStartProcessingRequest(ProcessRequestArgs args)
{
args.ServiceUri = new Uri("http://apigee.com/odata/v1/");
}