Linq over WCF
От: IT Россия linq2db.com
Дата: 07.08.10 14:05
Оценка: 82 (12)
Как говорится we are proud to announce the very first fully functional Linq provider over WCF. Первый в мире полноценный Linq провайдер работающий через WCF.

Качать как всегда здесь.

Критика, замечания, пожелания, особенно специалистов по WCF и защите, приветствуются.

Запустить пример в одном процессе можно примерно так:

using (var host = new ServiceHost(new LinqService(), new Uri("net.tcp://localhost:1234")))
{
    host.Description.Behaviors.Add(new ServiceMetadataBehavior());
    host.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;
    host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
    host.AddServiceEndpoint(
        typeof(ILinqService),
        new NetTcpBinding(SecurityMode.None)
        {
            MaxReceivedMessageSize = 10000000,
            MaxBufferPoolSize      = 10000000,
            MaxBufferSize          = 10000000,
            CloseTimeout           = new TimeSpan(00, 01, 00),
            OpenTimeout            = new TimeSpan(00, 01, 00),
            ReceiveTimeout         = new TimeSpan(00, 10, 00),
            SendTimeout            = new TimeSpan(00, 10, 00),
        },
        "LinqOverWCF");

    host.Open();

    var ctx = new ServiceModelDataContext(
        new NetTcpBinding(SecurityMode.None)
        {
            MaxReceivedMessageSize = 10000000,
            MaxBufferPoolSize      = 10000000,
            MaxBufferSize          = 10000000,
            CloseTimeout           = new TimeSpan(00, 01, 00),
            OpenTimeout            = new TimeSpan(00, 01, 00),
            ReceiveTimeout         = new TimeSpan(00, 10, 00),
            SendTimeout            = new TimeSpan(00, 10, 00),
        },
        new EndpointAddress("net.tcp://localhost:1234/LinqOverWCF"));

    var list = ctx.GetTable<Person>().ToList();

    host.Close();

    return list;
}


Вкратце как это работает.

BLT Linq провайдер общается с контекстом данных через интерфейс IDataContext, которому передаётся распарсенный Linq запрос в виде структуры SqlQuery. SqlQuery фактически представляет собой SQL AST. ServiceModelDataContext сериализует эту структуру и передаёт LinqService, который в свою очередь формирует SQL, выполняет запрос и возвращает данные клиенту. Всё просто.

Самый больной вопрос в данном подходе, конечно же, безопасность, если она актуальна. LinqService содержит метод ValidateQuery, который можно использовать для валидации запроса. По умолчанию, LinqService всего лишь не позволяет использовать DML операции, но, в принципе, нет никаких проблем сделать более интеллектуальную проверку структуры запроса. Например, на использование несанкционированных таблиц или полей. Собственно говоря, на эту тему хотелось бы побольше поговорить и услышать мнения насчёт типовых сценариев защиты, которые можно было бы реализовать прямо в библиотеке, т.к. хотя SqlQuery и можно анализировать, но в языках не поддерживающих patten matching это занятие не из весёлых.
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.