gpt4 book ai didi

c# - 系统.安全.SecurityException : That assembly does not allow partially trusted callers

转载 作者:行者123 更新时间:2023-11-30 17:10:45 24 4
gpt4 key购买 nike

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

按照以下步骤操作

  1. 默认情况下,System.Messaging 引用在 sql server 中不可用,因此创建了这个程序集

    改变数据库 [AdventureWorksLT2008] SET TRUSTWORTHY on创建 ASSEMBLY 消息授权 dbo来自 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll'使用 PERMISSION_SET = EXTERNAL_ACCESS去

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

SqlMSMQ.dll 是sql server 应用程序dll。

  1. 创建存储过程创建过程 [dbo].[Proc_Send_Queue] (@queue nvarchar, @msg nvarchar)作为调用者执行作为外部名称 [MSMQApp].[CLRProcedure.StoredProcedure].[Proc_Send_Queue]
  2. 在执行存储过程时使用 [AdventureWorksLT2008]去声明@return_value intEXEC @return_value = [dbo].[Proc_Send_Queue] @queue = N'SampleQ', --msmq 名称 @msg = N'Simpel queue message' -- 消息选择“返回值”= @return_value去

    抛出以下错误

    消息 6522,级别 16,状态 1,过程 Proc_Send_Queue,第 0 行执行用户定义例程或聚合“Proc_Send_Queue”期间出现 .NET Framework 错误:System.Security.SecurityException:该程序集不允许部分受信任的调用方。系统.安全.SecurityException:在 CLRProcedure.StoredProcedure.Proc_Send_Queue(SqlString 队列,SqlString 消息)

感谢您帮助解决这个问题。

提前致谢

最佳答案

Allowing Partially Trusted Callers状态:

We recommend that all assemblies registered in SQL Server, except those assemblies added to the global assembly cache, be marked with the AllowPartiallyTrustedCallers attribute so that assemblies loaded by SQL Server can access each other.

您完全按照建议进行操作,但出现错误。发生什么了?参见 Strong named assemblies and AllowPartiallyTrustedCallers :

When assembly B calls strong-named assembly A,

Either A must have AllowPartiallyTrustedCallers attribute Or B must have unsafe (FullTrust) permission set.

在您的例子中,“B”是 SqlMSMQ.dll,强名称的“A”是 System.Messaging.dll。由于您无法将“A”修改为具有 APTC 属性,唯一的解决方案是将“B”修改为完全可信(即不安全):

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

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

关于c# - 系统.安全.SecurityException : That assembly does not allow partially trusted callers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11859606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com