System.Security.SecurityException:该程序集不允许部分信任的调用者

时间:2012-08-08 07:21:36

标签: c# sql-server

我正在尝试使用集成在sql server 2008中的clr存储过程创建一个简单的msmq消息传递应用程序。

遵循以下步骤

  1. 通过defualt System.Messaging引用在sql server中不可用,所以创建了这个程序集

    ALTER DATABASE [AdventureWorksLT2008]设置TRUSTWORTHY 创建ASSEMBLY消息 授权dbo FROM'C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ System.Messaging.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS GO

  2. 2.使用存储过程创建sql server应用程序

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Data.SqlTypes;
    using System.Data.SqlClient;
    using Microsoft.SqlServer.Server;
    using System.Messaging;
    using System.Security;
    
        [assembly: AllowPartiallyTrustedCallers]
        namespace CLRProcedure
        {
    
            public class StoredProcedure
            {
                /// <summary>
                /// Sends message to queue
                /// </summary>
                /// <param name="queue">Queue path</param>
                /// <param name="msg">Message</param>
                [SqlProcedure]
    
                public static void Proc_Send_Queue(SqlString queue, SqlString msg)
                {
                    using (MessageQueue msgQueue = new MessageQueue(queue.ToString(), QueueAccessMode.Send))
                    {
                        msgQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
                        msgQueue.Send(msg.Value);
                    }
                }
             }     
         }
    
    1. 在sql server中注册了该程序集 从'E:\ CCA Parctise \ SqlMSMQ.dll'创建程序集MSMQApp
    2. SqlMSMQ.dll是sql server applicaiton dll。

      1. 创建存储过程 创建PROCEDURE [dbo]。[Proc_Send_Queue]     (@queue nvarchar,     @msg nvarchar) 执行作为调用者 如 外部名称[MSMQApp]。[CLRProcedure.StoredProcedure]。[Proc_Send_Queue]
      2. 执行存储过程时 USE [AdventureWorksLT2008] 走 DECLARE @return_value int EXEC @return_value = [dbo]。[Proc_Send_Queue]         @queue = N'SampleQ', - msmq名称         @msg = N'Simpel队列消息' - 消息 SELECT'返回值'= @return_value GO

        抛出以下错误

        消息6522,级别16,状态1,过程Proc_Send_Queue,第0行 在执行用户定义的例程或聚合“Proc_Send_Queue”期间发生.NET Framework错误: System.Security.SecurityException:该程序集不允许部分信任的调用者。 System.Security.SecurityException: at CLRProcedure.StoredProcedure.Proc_Send_Queue(SqlString queue,SqlString msg)

      3. 感谢您的帮助以解决这个问题。

        提前致谢

1 个答案:

答案 0 :(得分:2)

Allowing Partially Trusted Callers州:

  

我们建议在SQL Server中注册的所有程序集除外   添加到全局程序集缓存的那些程序集,标记为   AllowPartiallyTrustedCallers属性,以便加载程序集   通过SQL Server可以互相访问。

你完全按照推荐说的做了,而且你得到了错误。发生什么了?见Strong named assemblies and AllowPartiallyTrustedCallers

  

当程序集B调用强名称程序集A时,

     

A必须具有AllowPartiallyTrustedCallers属性或B必须   有不安全(FullTrust)权限集。

在您的情况下,“B”为SqlMSMQ.dll,强名称“A”为System.Messaging.dll。由于您无法修改“A”以获得APTC属性,因此唯一的解决方案是将“B”修改为完全受信任(即UNSAFE):

 create assembly MSMQApp from 'E:\CCA Parctise\SqlMSMQ.dll'
   with permission_set = unsafe;

您的邮件的收件人是什么?如果是由SQL Server支持的另一个应用程序,那么您在Service Broker中有更好的选择。