【发布时间】:2016-02-17 02:33:32
【问题描述】:
我在 SQL Server 2012 中有一个从事务中调用的 C# CLR (.NET 4.5) 存储过程。 CLR 调用需要 TLS 1.2 的 WebService。
如果我使用 permission_set = UNSAFE 创建程序集,一切正常,但我真的很想避免这种情况,而是使用 EXTERNAL_ACCESS .然而,事实证明这是一个真正的挑战。
使用EXTERNAL_ACCESS有两个问题:
1) 我从 CLR 写入日志文件(出于维护和调试目的),由于不允许锁定,这不起作用:
private static readonly object Locker = new object();
public static string LogMessage(string message)
{
message = String.Format("{0}: {1}" + Environment.NewLine, DateTime.Now, message);
lock (Locker)
{
var file = new FileStream(GetConfigValue("LogFile"), FileMode.Append, FileAccess.Write);
var sw = new StreamWriter(file);
sw.Write(message);
sw.Flush();
sw.Close();
}
return message;
}
错误信息:
System.Security.HostProtectionException:尝试执行 CLR 主机禁止的操作。
受保护的资源(仅在完全信任的情况下可用)是:所有需要的资源是:同步、外部线程
我可以改为记录到数据库表,但由于对 CLR 的调用来自事务内部,因此错误会导致回滚,这也会回滚日志记录。我可以使用事件日志,但如果可能的话,我真的不想这样做。
2) 我调用的 Web 服务需要 TLS 1.2,但不允许设置 ServerCertificateValidationCallback:
ServicePointManager.ServerCertificateValidationCallback = AcceptAllCertifications;
错误信息:
System.Security.SecurityException:请求“System.Security.Permissions.SecurityPermission,mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”类型的权限失败。
System.Security.SecurityException:
在 System.Security.CodeAccessSecurityEngine.Check(对象需求,StackCrawlMark& stackMark,布尔 isPermSet) 在 System.Security.CodeAccessPermission.Demand() 在 System.Net.ServicePointManager.set_ServerCertificateValidationCallback(RemoteCertificateValidationCallback 值) 在 AcmeClr.StoredProcedures.ProcessPayment(SqlMoney 金额, SqlString ticketNo, SqlString& resultCode, SqlString& resultText)
是否有解决这个问题的方法 - 有没有办法在不使用 UNSAFE 的情况下完成这项工作?
【问题讨论】:
标签: c# .net sql-server clr sqlclr