Ошибка SqlClientPermission в сборке, загруженной с помощью отражения - PullRequest
2 голосов
/ 31 июля 2009

У меня действительно тяжелое время с проблемой. У меня есть только что измененное веб-приложение, которое позволяет заказчикам предоставлять пользовательские сборки, которые они могут использовать для подключения к конвейеру сохранения сущностей. Эти пользовательские сборки загружаются с помощью отражения, когда объект сохраняется в базе данных. Они относятся к общей сборке DAL, которая обрабатывает весь доступ к данным.

У меня есть тестовый сервер (Win2k3), на котором эта система работает безупречно. Теперь, когда я перенес его в мой кластер производственных серверов (один Win2k3 и один Win2k8), моя пользовательская сборка бомбит при первом вызове метода DAL, который обращается к базе данных (SQL2005). Информация журнала, которую я собираю, указывает на сбой при получении SqlClientPermission. Вопреки рекомендациям, мое веб-приложение работает в режиме полного доверия. Моя пользовательская сборка имеет строгое имя.

Есть ли какие-нибудь предложения, где я могу найти различия между конфигурацией моего тестового сервера и конфигурациями моего рабочего сервера? Если это не тот форум, то какой?

Спасибо, Мэтью

Ответы [ 3 ]

1 голос
/ 24 августа 2010

Я столкнулся с подобной проблемой без размышлений. Я переносил скомпилированный проект с моей машины Win 2k3 на Win 2k8. - В IIS перейдите в папку bin, где находятся dll и щелкните правой кнопкой мыши. - Перейдите к «Редактировать разрешения ...». - В самом низу вкладки «Общие» может быть кнопка «Разблокировать».

Win 2k8 не похоже, что dll скопирована из другой среды.

0 голосов
/ 31 июля 2009

Вот метод в отраженном объекте, который бомбит:

    public EntityBase2 AfterSave(EntityBase2 entity, DataAccessAdapterBase adapter)
    {
        SurveyResponseEntity response = entity as SurveyResponseEntity;

        if (response.IsComplete) // we only really want to do this if the survey has been completed.
        {
            SurveyEntity survey = new SurveyEntity(response.SurveyRefId);
            IPrefetchPath2 questionSetPath = new PrefetchPath2((int)SS2DAL.EntityType.SurveyEntity);
            IPredicateExpression filter = new PredicateExpression(QuestionSetFields.Current == 1);
            questionSetPath.Add(SurveyEntity.PrefetchPathQuestionSetCollection, 1, filter)
                .SubPath.Add(QuestionSetEntity.PrefetchPathQuestionPageCollection)
                    .SubPath.Add(QuestionPageEntity.PrefetchPathQuestionCollection);

            if (adapter.FetchEntity(survey, questionSetPath))
            {
                // we need to instantiate the survey template save handler from this survey response (if it exists)
                // then execute

                if (!String.IsNullOrEmpty(survey.PostSaveAssemblyName) && !String.IsNullOrEmpty(survey.PostSaveClassName))
                {
                    try
                    {
                        string assemblyPath = (new FileService()).GetRootAssemblyURL();

                        Assembly asm = Assembly.Load(File.ReadAllBytes(Path.Combine(assemblyPath, survey.PostSaveAssemblyName)));

                        if (asm != null)
                        {
                            Type t = asm.GetType(survey.PostSaveClassName);
                            ISurveyPostSaveHandler cls = (ISurveyPostSaveHandler)Activator.CreateInstance(t);
                            if (cls != null)
                            {
                                cls.AfterSave(response, survey, adapter);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        // at some point, we need to add some logging here.
                        Logger.ErrorFormat("There was an error post-processing survey response {0} from survey {1}: {2}", response.SurveyResponseId, survey.Name, ex.ToString());
                        throw ex;
                    }
                }
            }
            else
            {
                Logger.ErrorFormat("Could not post process response {0} because the parent survey could not be located", response.SurveyResponseId);
                throw new ApplicationException(String.Format("Could not post process response {0} because the parent survey could not be located", response.SurveyResponseId));
            }
        }

        return response;
    }

    #endregion
}
0 голосов
/ 31 июля 2009

Не ответ, но больше информации, чем я могу добавить в комментарии ...

Теперь кажется, что это проблема Win2k8 vs Win2k3, поскольку я больше не получаю никаких исключений в журналах с сервера Win2k3 в нашем кластере.

По сути, наша сущность сохраняет конвейерную проверку, чтобы увидеть, реализует ли тип сохраняемой сущности определенный интерфейс. Если это так, то приложение отправляется в базу данных, чтобы получить сборку и имя класса для класса, который реализует пользовательские функции до и после сохранения. Эти сборки находятся в папке «App_Data» в папке «Assemblies \». Затем приложение загружает сборку; использует отражение для создания экземпляра соответствующего класса из этой сборки в качестве интерфейса, а затем вызывает методы этого метода до и после сохранения, чтобы выполнить специфические для клиента действия для этого конкретного типа объекта. В нашем случае это настраиваемое действие выполняет некоторые операции с базой данных, используя классы сущностей DAL (который использует LLBLGen, FWIW).

Моя первоначальная проблема заключалась в том, что я получал исключение SecurityException о запрете частично доверенных вызывающих программ, поэтому я украсил сборки, которые используются с атрибутом «AllowPartiallyTrustedCallers».

В моей сборке расширений, которая загружается, я создаю экземпляр SqlClientPermission и "Assert ()" его, но я нигде фактически не предоставил это разрешение (за исключением того, что мое веб-приложение работает в FullTrust).

Спасибо за любую помощь, которую вы можете предложить ...

* 1013 Матфея *

Вот вывод .ToString () исключения, которое выдается:

Error performing post-save operation on entity 373c595e-843b-45a1-82d0-aa166daf75de of type SS2DAL.EntityClasses.SurveyResponseEntity: SD.LLBLGen.Pro.ORMSupportClasses.ORMQueryExecutionException: An exception was caught during the execution of a retrieval query: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.. Check InnerException, QueryExecuted and Parameters of this exception to examine the cause of this exception. ---> System.Security.SecurityException: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
   at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   at System.Security.CodeAccessPermission.Demand()
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at SD.LLBLGen.Pro.ORMSupportClasses.RetrievalQuery.Execute(CommandBehavior behavior)
The action that failed was:
Demand
The type of the first permission that failed was:
System.Data.SqlClient.SqlClientPermission
The first permission that failed was:
<IPermission
version="1"
AllowBlankPassword="False">
<add KeyRestrictions=""
KeyRestrictionBehavior="AllowOnly"/>
</IPermission>

The demand was for:
<IPermission
version="1"
AllowBlankPassword="False">
<add KeyRestrictions=""
KeyRestrictionBehavior="AllowOnly"/>
</IPermission>

The granted set of the failing assembly was:
<PermissionSet
version="1">
<IPermission
version="1"
Access="Open"/>
<IPermission
version="1"
Allowed="ApplicationIsolationByUser"
UserQuota="512000"/>
<IPermission
version="1"
Flags="Execution"/>
<IPermission
version="1"
Window="SafeTopLevelWindows"
Clipboard="OwnClipboard"/>
<IPermission
version="1"
PublicKeyBlob="0024000004800000940000000602000000240000525341310004000001000100B55C03865E07BCB230B04EF7D9ACF1E7BF41C618DB1327895C25328446039F51CF237A50989E542D3FA9BB5991D303388C5AAC7AE4E071CD7B42B96B16256FF905EC610107DB2A0872E971253919BA528187489FC89FD083118F562319BF3B66CB79035EC50D2291561D4F2B9733AD5E0ECD9BFF9B80B94C40F5888D4E1C5BDD"
Name="ProjectHelpers.Extensions"
AssemblyVersion="2.2009.208.1821"/>
<IPermission
version="1"
Url="file://dc01.bizspeed.datacenter/websites/sitesupervisor files/prjh/ProjectHelpers.Extensions.dll"/>
<IPermission
version="1"
Zone="Internet"/>
<IPermission
version="1"
Level="SafePrinting"/>
</PermissionSet>

The assembly or AppDomain that failed was:
ProjectHelpers.Extensions, Version=2.2009.208.1821, Culture=neutral, PublicKeyToken=4405fd38c7d52787
The method that caused the failure was:
SD.LLBLGen.Pro.ORMSupportClasses.EntityBase2 AfterSave(SD.LLBLGen.Pro.ORMSupportClasses.EntityBase2, SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase)
The Zone of the assembly that failed was:
Internet
The Url of the assembly that failed was:
file://dc01.bizspeed.datacenter/websites/sitesupervisor files/prjh/ProjectHelpers.Extensions.dll
   --- End of inner exception stack trace ---
   at SD.LLBLGen.Pro.ORMSupportClasses.RetrievalQuery.Execute(CommandBehavior behavior)
   at SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase.ExecuteSingleRowRetrievalQuery(IRetrievalQuery queryToExecute, IEntityFields2 fieldsToFill, IFieldPersistenceInfo[] fieldsPersistenceInfo)
   at SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase.FetchEntityUsingFilter(IEntityFields2 fieldsToFetch, IFieldPersistenceInfo[] persistenceInfos, IRelationPredicateBucket filter)
   at SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase.FetchEntityUsingFilter(IEntity2 entityToFetch, IPrefetchPath2 prefetchPath, Context contextToUse, IRelationPredicateBucket filter, ExcludeIncludeFieldsList excludedIncludedFields)
   at SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase.FetchEntity(IEntity2 entityToFetch, IPrefetchPath2 prefetchPath, Context contextToUse, ExcludeIncludeFieldsList excludedIncludedFields)
   at SD.LLBLGen.Pro.ORMSupportClasses.DataAccessAdapterBase.FetchEntity(IEntity2 entityToFetch, IPrefetchPath2 prefetchPath)
   at ProjectHelpers.Extensions.SurveyResponseSaveHelper.AfterSave(EntityBase2 entity, DataAccessAdapterBase adapter)
   at SS2.RemoteObjects.DataPortal.EntitySaveWithoutRemoting(EntityBase2 entity, AuditSettings auditSettings, AuthTicket at)  [NDC:(null)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...