2016-08-12 6 views
0

У меня есть отчет SSRS, который ссылается на сборку dll с одним классом, который должен вызывать хранимую процедуру, но возвращает эту ошибку..NET Framework 4.5 Безопасность: сборка запросов SSRS в ошибке генерации C#

Запрос на разрешение типа 'System.Data.SqlClient.SqlClientPermission, system.Data, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089' не удалось.

Я не знаю, C#, но прихрамывали это с помощью некоторых друзей и коллег. Надо было бы добавить:

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

к классу, и я получил эту ошибку: Невозможно выполнить CAS Утверждает в безопасности прозрачных методов

Leading меня посмотреть, что изменилось после того, как .NET 4.0. Я удалил бит SQLClientPermissions и добавил его в AssemblyInfo:

[assembly: SecurityRules(SecurityRuleSet.Level2)] 
[assembly: SecurityCritical()] 

Которая вернула исходную ошибку. Это Класс:

using System.Text; 
using System.Threading.Tasks; 
using System.Data; 
using System.Data.SqlClient; 
using System.Security; 
using System.Security.Permissions; 
namespace ClassLibrary1 
{ 
    public class Class1 
    { 
     public static string logReportAttributes(string ReportName, int GlobalsTotalPages) 
     { 
      string retValue = String.Empty; 
      try 
      { 
       long TOCExecutionID = long.Parse(DateTime.Now.ToString("yyyyMMddHHmmss")); 
       SqlConnection connection = new SqlConnection("Persist Security Info=True;Trusted_Connection=True;initial catalog=InternalApps;data source=DEVSQL1;User ID=xxxxx;password=xxxxx;MultipleActiveResultSets=true;"); 
       using (SqlCommand cmd = new SqlCommand("usp_LogReportAttributes", connection)) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.AddWithValue("@ReportName", ReportName); 
        cmd.Parameters.AddWithValue("@GlobalsTotalPages", GlobalsTotalPages); 
        connection.Open(); 
        cmd.ExecuteNonQuery(); 
       } 
       if (connection.State == ConnectionState.Open || connection.State == ConnectionState.Broken) 
       { 
        connection.Close(); 
       } 
       retValue = "Sent Successfully"; 
      } 
      catch (Exception ex) 
      { 
       retValue = string.Format ("{0} \n\r {1}" , ex.Message != null ? ex.Message : "" , ex.InnerException != null ? ex.InnerException.Message : ""); 
      } 
      return retValue; 
     } 
    } 
} 

Кто-нибудь есть идея, что я делаю неправильно и как получить правильную безопасность настроить для этого? Спасибо!

ответ

0

Исходная ошибка - это ошибка, возникающая из параметров политики кода для сервера отчетов. Существует файл конфигурации, называемый RSSrvPolicy.config, где вы можете указать разные CodeGroups и соответствующий уровень доверия (в ReportServer \ bin). Там вы можете предоставить доступ к DLL FullTrust.

Эта страница MSDN просматривает некоторые детали и, что более важно, имеет пример тега CodeGroup: https://msdn.microsoft.com/en-us/library/ms154658.aspx#Anchor_1