2013-07-30 4 views
0

Мы готовимся к созданию проекта, в котором мы хотим публиковать данные через OData и Soap (чтобы пользователи нашего API выбирали, какой формат они хотят использовать). Я знаю, что веб-API позволяет выставлять открытый метод действия с IQueryable как возвращаемым типом, а затем значение T становится запрашиваемым из OData. Проблема в том, что наш веб-сервер находится в DMZ и не будет иметь прямого доступа к Entity Framework, поэтому прямой доступ к IQueryable невозможен. Доступ во внутреннюю сеть осуществляется через WCF.Доступ с OData с сервера DMZ

Есть ли способ получить значения из вызова OData и прокси-сервера через параметры во внутреннюю сеть? Я прочесываю интернет, и до сих пор не нашел ничего полезного. Я думал, что просто возьму строку запроса напрямую, передаю ее во внутреннюю сеть и там, использую что-то вроде PredicateBuilder для создания дерева выражений EF и возвращаю данные. Это будет работать, но мне интересно, есть ли лучший способ.

Заранее благодарен!

ответ

1

Очень легко обрабатывать запросы OData самостоятельно, и вы можете вернуть IEnumerable, IList, PageResults или что угодно. Вот пример:

[HttpGet] 
[ActionName("Example")] 
public IEnumerable<Poco> GetExample(ODataQueryOptions<Poco> queryOptions) 
{ 
    //simulate an EF DbSet for the example 
    var data = new Poco[] { 
     new Poco() { id = 1, name = "one", type = "a" }, 
     new Poco() { id = 2, name = "two", type = "b" }, 
     new Poco() { id = 3, name = "three", type = "c" } 
    }; 

    var t = new ODataValidationSettings() { MaxTop = 2 }; 
    queryOptions.Validate(t); 

    var s = new ODataQuerySettings() { PageSize = 1 }; 
    var results = queryOptions 
     .ApplyTo(data.AsQueryable(), s) as IEnumerable<Poco>; 

    return results; 
} 

public class Poco 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public string type { get; set; } 
} 
+0

Благодарим за это, так как это отличный пример! Однако это не совсем то, о чем я прошу. Моя служба OData не будет иметь прямого доступа к БД, поскольку она живет в DMZ, а прокси-вызовы - к WCF-сервису внутри домена. Таким образом, любые данные, которые он возвращает, в конечном итоге будут поступать из отдельной службы, а не непосредственно из БД. То, что я хотел бы сделать, - ограничить запрашиваемые данные в службе WCF, а не возвращать все, а затем фильтровать. Поэтому я хочу, чтобы параметры фильтра, сортировки и т. Д. Поступали во внутреннюю службу, отфильтровывали данные там, а затем возвращали результаты обратно в трубу. –

+0

@JamieNordmeyer технически вы можете запустить этот код на любом уровне вашего приложения. Или вы можете разбить части класса «ODataQueryOptions» и построить свой собственный запрос. $ top, $ skip и т. д. очень просто, сложность возникает, когда вы пытаетесь сломать '$ filter'. – qujck

+1

Я действительно собираюсь взглянуть на это. :) Я подумал об этом после моего ответа раньше; У меня просто не было времени, чтобы выкопать его. Я дам Вам знать. –

0

Я хотел бы предложить создание службы данных WCF с помощью модели Entity Framework и сделать это сервис, доступный сервер DMZ. Я запускаю веб-сайт на сервере DMZ с этой конфигурацией уже несколько лет, и он работал хорошо. Тем не менее, я буду признавать, что службы данных WCF имеют некоторые ограничения (по сравнению с прямым доступом к Entity Framework) о том, как вы можете создавать свои запросы IQueryable, но, похоже, улучшается с каждой версией.

Смежные вопросы