Вопрос

У меня есть расширение доставки, запущенное внутри отчетности 2008 года.

Это проводится нормально в течение длительного времени. Но теперь я хочу сделать вставку в базу данных в пределах расширения.

Первая ошибка я получил, это было:

Exception: System.Security.SecurityException Exception Message: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. Stacktrace:    at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
   at System.Security.PermissionSet.Demand()
   at System.Data.Common.DbConnectionOptions.DemandPermission()
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.SqlClient.SqlConnection.Open()

Затем я добавил это, до моего кода, который открывает соединение и делает вставку:

SqlClientPermission sqlPermission = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
sqlPermission.Assert();

Тогда сообщение об ошибке изменилось на это:

Exception: System.Security.SecurityException Exception Message: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. Stacktrace:    at System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 unrestrictedOverride, Int32 create)
   at System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark)
   at System.Security.CodeAccessPermission.Assert()

Затем я добавил следующую строку:

SecurityPermission permission = new SecurityPermission(PermissionState.Unrestricted);
permission.Assert();

И теперь ошибка, которую я получаю, это:

Exception: System.Security.SecurityException Exception Message: Stack walk modifier must be reverted before another modification of the same type can be performed. Stacktrace:    at System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark)
   at System.Security.CodeAccessPermission.Assert()

Мой код, который содержит фактический конкретный код SQLConnection, находится в сборке, на который ссылается на расширение доставки. Конкретный код разрешений был внутри этого сборки, но я попытался переместить его в усадку доставки, но WOTHOUT любой удачи.

Это было полезно?

Решение

В точке вы пытаетесь изменить разрешения доступа, вы, возможно, уже унаследовали его от более высокого уровня, или, возможно, вы сделали его где-то до того, как вы находитесь.

Например, у нас есть код так:

SqlClientPermission sqlClientPermission = new SqlClientPermission(PermissionState.Unrestricted);
sqlClientPermission.Assert();

SecurityPermission securityPermission = new SecurityPermission(PermissionState.Unrestricted);
securityPermission.Assert();

У нас будет исключение, как ваш.

Другие советы

User407428 правильный, пытаясь включить два разных модификатора - это то, что вызывает вашу проблему. Лучшим принципом состоит в том, чтобы разрешить разрешение на часть кода, который требует его, а затем отключить разрешение после слов. Так что, когда вам нужно следующее разрешение, вы можете снова изменять эти права.

SqlClientPermission sqlClientPermission = new SqlClientPermission(PermissionState.Unrestricted);
sqlClientPermission.Assert();

   //<your code that requires SqlClientPermission here>

CodeAccessPermission.RevertAccess();

SecurityPermission securityPermission = new SecurityPermission(PermissionState.Unrestricted);
securityPermission.Assert();

Некоторые еще предприняты во внимание, что в основном он не требуется держать объект к прогулке стека, поэтому Assert может быть упрощен в одну строку, Ei.

System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();

Если вы модифицировали стек-прогулку в методе инкапсулирования, внутренний стек будет возможно нет Сможете изменить модификаторы снова. Бывший.

public void UseSecurityPermission()
{
    CodeAccessPermission.RevertAssert();
    new System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();

    <Some code that requires the SecurityPermission>
}

static void Main(string[] args)
{
    new System.Security.Permissions.FileIOPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();
    //< Some code that requires IOPermission>
    UseSecurityPermission();
}   

Несмотря на то, что INESEESTURITERPERMISSY () возвращает разрешение на прогулку стека, он не будет работать, потому что компилятор не может получить дескриптор безопасности в контексте.

Некоторые дальше чтения:Программирование со стеком-модификаторами

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top