У мене є служба 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/");
}