Здравствуйте, IT, Вы писали:
A>>На уровне ТЗ, например. На том же уровне он может быть НЕ фиксирован, а наоборот весьма динамическим. То есть если у тебя Admins, Users, Anonymous, как на большинстве сайтов, то роли фиксированы. Но в других случаях список ролей модет менятся после установки и инициализации приложения. IT>Ну и что? По любому для того, чтобы роли как-то влияли на ход выполнения приложения у тебя должен быть код, который это поддерживает. То ли это User.InRole, то ли компонент, читающий конфиг или метаданные из базы. Такой код должен быть. Или я опять чего-то не понимаю?
Нет-нет, ты прав, конечно должна быть какая-то проверка. Просто конкретно приведённый тобой пример не расширяем и не масштабируем. Проверка выполняется в .Net, а не в SQL, коде. Это сильно связывает руки.
Здравствуйте, AndrewVK, Вы писали:
IT>>Чтобы иметь возможность настраивать приложение без перекомпиляции. AVK>Зачем? Вот никогда не понимал этой страсти вытаскивать потроха приложения во внешний, трогаемый грязными ручками админов файл.
Да мне-то пофиг где и как его настраивать. Это же вы вроде как без конфигов жить не можете
IT>>Это в теории. AVK>И на практике тоже.
Ни разу в жизни не видел. Хотя вполне допускаю такую возможность, но не думаю, что это широкораспространённая практика.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, adontz, Вы писали:
A>Просто конкретно приведённый тобой пример не расширяем и не масштабируем. Проверка выполняется в .Net, а не в SQL, коде. Это сильно связывает руки.
Конкретно мой пример можно реализовать не хуже чем проверка в SQL. Точнее это и будет проверка в SQL. Поверь мне, в своих проектах я использую секьюрити не только для доступа пользователей к определённому функционалу, но и к определённым данным тоже.
В общем, разговор у нас съехал совсем не туда. Меня сейчас интересуют типовые базовые сценарии, которые можно реализовать прямо в библиотеке. Если получится, то может быть удастся сделать их относительно легко расширяемыми.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>В общем, разговор у нас съехал совсем не туда. Меня сейчас интересуют типовые базовые сценарии, которые можно реализовать прямо в библиотеке. Если получится, то может быть удастся сделать их относительно легко расширяемыми.
Ну я уже перечислил.
1) Row-level security по таблице с явными разрешениями для типов и экзмепляров.
2) Тоже самое, но с учётом разрешений на объекты ссылаемые foreign key.
3) Тоже самое, но с учётом попадания в период времени, окно со скользящими или прыгающими началом и концом.
Здравствуйте, adontz, Вы писали:
IT>>В общем, разговор у нас съехал совсем не туда. Меня сейчас интересуют типовые базовые сценарии, которые можно реализовать прямо в библиотеке. Если получится, то может быть удастся сделать их относительно легко расширяемыми.
A>Ну я уже перечислил. A>1) Row-level security по таблице с явными разрешениями для типов и экзмепляров. A>2) Тоже самое, но с учётом разрешений на объекты ссылаемые foreign key. A>3) Тоже самое, но с учётом попадания в период времени, окно со скользящими или прыгающими началом и концом.
A>Я что-то не про то говорю или про то?
Я не понимаю ни один из этих пунктов. Что такое, например, разрешение для типов и экзмепляров?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, adontz, Вы писали:
IT>>>В общем, разговор у нас съехал совсем не туда. Меня сейчас интересуют типовые базовые сценарии, которые можно реализовать прямо в библиотеке. Если получится, то может быть удастся сделать их относительно легко расширяемыми.
A>>Ну я уже перечислил. A>>1) Row-level security по таблице с явными разрешениями для типов и экзмепляров. A>>2) Тоже самое, но с учётом разрешений на объекты ссылаемые foreign key. A>>3) Тоже самое, но с учётом попадания в период времени, окно со скользящими или прыгающими началом и концом.
A>>Я что-то не про то говорю или про то?
IT> Я не понимаю ни один из этих пунктов. Что такое, например, разрешение для типов и экзмепляров?
Ладно, постараюсь разъяснить
1) Row-level security по таблице с явными разрешениями для типов и экземпляров.
Разрешение для типа — Могу работать со складами. Любыми, всеми, вообще.
Разрешение для экземпляра — Могу работать со складом 37.
Отдельно следует иметь возможность работать с обхектом и работать с объектом каким-то определённым способом.
Иногда, как в случае со складом, способы фиксированны: приход, расход, списание. Иногда список операций над объектом на которые надо раздавать права меняется пользователем. Например в IT склад можно добавить объект "картриджи", добавить операцию "заправка картриджа" и потом указывать кто и что может делать с картриджем.
2) Тоже самое, но с учётом разрешений на объекты ссылаемые foreign key.
Могу работать только со складом 37. Эта транзакция списывает товар со склада 42 и я её не вижу. Эта принимает товар на склад 37 и я её вижу.
3) Тоже самое, но с учётом попадания в период времени, окно со скользящими или прыгающими началом и концом.
Не могу оформлять перемещения товара задним числом (скользящее окно)
Не могу редактировать перемещения товара не за текущую неделю (прыгающее окно)
Здравствуйте, adontz, Вы писали:
IT>> Я не понимаю ни один из этих пунктов. Что такое, например, разрешение для типов и экзмепляров? A>Ладно, постараюсь разъяснить
Это всё фильтрация. Мы уже даже почти определились как её лучше сделать.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>>> Я не понимаю ни один из этих пунктов. Что такое, например, разрешение для типов и экзмепляров? A>>Ладно, постараюсь разъяснить IT>Это всё фильтрация. Мы уже даже почти определились как её лучше сделать.
Ну мой подход в том чтобы с сервера были видны все списки объектов (какой смысл кромсать модель?), но некоторые были пустыми, если нет доступа. Задашь более конкретный вопрос, получишь более конкретный ответ.
Здравствуйте, IT, Вы писали:
IT>Запустить пример в одном процессе можно примерно так:
IT>
IT>using (var host = new ServiceHost(new LinqService(), new Uri("net.tcp://localhost:1234")))
IT>{
.....
IT> var list = ctx.GetTable<Person>().ToList();
........
IT>}
IT>
Что делать в случае, если таблица Person большая ? А тем не менее хотелось бы выбрать всю таблицу ? Может ли помочь изменение " MaxStringContentLength property on the XmlDictionaryReaderQuotas " и как до него добраться ?
У меня вываливается исключение
System.ServiceModel.Dispatcher.NetDispatcherFaultException was unhandled
Message=The formatter threw an exception while trying to deserialize the message: There was an error while trying to deserialize parameter http://tempuri.org/:ExecuteReaderResult. The InnerException message was 'There was an error deserializing the object of type BLToolkit.ServiceModel.LinqServiceResult. The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.'. Please see InnerException for more details.
Source=mscorlib
Action=http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher/fault
StackTrace:
Server stack trace:
at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)
at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameter(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)
at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)
at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)
at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeReply(Message message, Object[] parameters)
at System.ServiceModel.Dispatcher.ProxyOperationRuntime.AfterReply(ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at BLToolkit.ServiceModel.ILinqService.ExecuteReader(LinqServiceQuery query)
at BLToolkit.ServiceModel.LinqServiceClient.ExecuteReader(LinqServiceQuery query) in d:\GeneratedCode\9\Test\BLToolkit\ServiceModel\LinqServiceClient.cs:line 43
at BLToolkit.ServiceModel.ServiceModelDataContext.BLToolkit.Data.Linq.IDataContext.ExecuteReader(Object query) in d:\GeneratedCode\9\Test\BLToolkit\ServiceModel\ServiceModelDataContext.cs:line 210
at BLToolkit.Data.Linq.Query`1.<RunQuery>d__2a.MoveNext() in d:\GeneratedCode\9\Test\BLToolkit\Data\Linq\Query.cs:line 367
at BLToolkit.Data.Linq.Query`1.<Map>d__32.MoveNext() in d:\GeneratedCode\9\Test\BLToolkit\Data\Linq\Query.cs:line 383
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Program.Main() in D:\GeneratedCode\9\Test\Test\Program.cs:line 106
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.Runtime.Serialization.SerializationException
Message=There was an error deserializing the object of type BLToolkit.ServiceModel.LinqServiceResult. The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.
Source=System.Runtime.Serialization
StackTrace:
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
at System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName)
at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest)
InnerException: System.Xml.XmlException
Message=The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.
Source=System.Runtime.Serialization
LineNumber=0
LinePosition=0
StackTrace:
at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3)
at System.Xml.XmlExceptionHelper.ThrowMaxStringContentLengthExceeded(XmlDictionaryReader reader, Int32 maxStringContentLength)
at System.Xml.XmlDictionaryReader.ReadContentAsString(Int32 maxStringContentLength)
at System.Xml.XmlBaseReader.ReadContentAsString()
at System.Xml.XmlBaseReader.ReadElementContentAsString()
at System.Xml.XmlBinaryReader.ReadElementContentAsString()
at System.Runtime.Serialization.XmlReaderDelegator.ReadElementContentAsString()
at ReadLinqServiceResultFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString[] , XmlDictionaryString[] )
at System.Runtime.Serialization.ClassDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, Type declaredType, DataContract& dataContract)
at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns)
at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
InnerException:
Здравствуйте, WaSh, Вы писали:
WS>Что делать в случае, если таблица Person большая ? А тем не менее хотелось бы выбрать всю таблицу ? Может ли помочь изменение " MaxStringContentLength property on the XmlDictionaryReaderQuotas " и как до него добраться ?
Помочь может. Как поменять — подробно описано в MSDN. Вкратце — или в конфиге ендпоинта, или в соотв. элементах описания биндинга при программном конфигурировании. Поиск в MSDN по MaxStringContentLength должен помочь.
... << RSDN@Home 1.2.0 alpha 4 rev. 1490 on Windows 7 6.1.7600.0>>
Скачал последнюю версию.
Все запросы Linq Over WCF не работают, отваливаются по таймауту.
До этого использовалась версия 4.0, все работало.
Сейчас не работает даже этот пример, см. ниже.
В чем подвох и как лечить?
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;
}