Frage

Ich habe eine Lieferung Erweiterung im Reporting Service 2008 ausgeführt wird.

Es ist seit langer Zeit läuft gut. Aber jetzt will ich aus der Verlängerung einen Einsatz in eine Datenbank machen.

Erste Fehler ich habe, war dies:

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()

Dann habe ich diese, bevor mein Code, der die Verbindung und macht den Einsatz öffnet:

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

Dann wird die Fehlermeldung an das geändert:

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()

Dann habe ich die folgende Zeile:

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

Und nun die Fehler, die ich bekommen, ist dies:

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()

Mein Code, der die tatsächlichen SqlConnection spezifischen Code enthält, ist in einer Baugruppe von der Auslageverlängerung verwiesen. Der Permission-spezifische Code war im Innern, die Montag, aber ich versuchte, es in die Auslageverlängerung bewegliche Einheit -. Aber wothout etwas Glück

War es hilfreich?

Lösung

An der Stelle, Sie versuchen, die Zugriffsberechtigungen zu ändern, können Sie es bereits von höherer Ebene geerbt haben, oder vielleicht haben Sie es irgendwo vor dem Punkt getan Sie sind.

Zum Beispiel haben wir Code wie folgt:

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

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

Wir werden die Ausnahme wie das Ihre haben.

Andere Tipps

user407428 korrekt ist, versuchen, zwei verschiedene Modifikatoren zu ermöglichen, ist das, was Ihr Problem verursacht. Das beste Prinzip ist es, die Erlaubnis für den Teil des Codes zu ermöglichen, die es erfordert, und dann die Erlaubnis anschliessend zu deaktivieren. So dass, wenn Sie die nächste Erlaubnis benötigen, können Sie diese Rechte ändern wieder.

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

   //<your code that requires SqlClientPermission here>

CodeAccessPermission.RevertAccess();

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

Einige weitere Dinge zu berücksichtigen ist, dass es meist nicht um ein Objekt auf den Stack-Spaziergang halten erforderlich, so kann die Assertion zu einer einzigen Zeile vereinfacht werden, ei.

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

Wenn Sie den Stapel-Weg in einem einkapselnden Verfahren modifiziert, wobei der innere Stapel würde wahrscheinlich nicht der Lage sein, die Modifikatoren wieder zu ändern. Bsp.

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();
}   

Auch wenn UseSecurityPermission () kehrt die Stack-walk Erlaubnis, es würde nicht funktionieren, da der Compiler nicht die Sicherheitsbeschreibung im Kontext erhalten.

Einige weitere Lektüre: Programmierung mit Stapel-Weg Modifikatoren leugnen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top