【问题标题】:Can I use SQL Server CE in a medium trust environment by just deploying the DLLs我可以通过仅部署 DLL 在中等信任环境中使用 SQL Server CE
【发布时间】:2012-02-15 15:31:23
【问题描述】:

我编写了一个使用 SQL Server CE 4.0 数据库的 ASP.NET 4.0 应用程序。这一切都在我的开发环境中使用中等信任(与主机相同的信任配置)。在这台机器上,我已经完成了安装过程(下载并安装了 MSI)。我现在正尝试将此解决方案部署到我的网络托管服务商。

正在运行的代码是(这是 Altairis Membership Provider 的直接副本:

using (HostingEnvironment.Impersonate())
using (var db = this.connectionString.CreateDbConnection())
using (var cmd = this.CreateDbCommand("SELECT PasswordHash, PasswordSalt FROM $Users WHERE UserName = @UserName AND IsApproved = 1", db)) 
{
     cmd.AddParameterWithValue("@UserName", username);
     db.Open();

     // Validate password
     using (var r = cmd.ExecuteReader()) { .. snip.. }
 }

在上面的实例中,db 是 DbConnection,cmd 是 DbCommand

我收到以下错误:

[InvalidOperationException:无法在安全透明方法中执行 CAS 断言] System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission 需求, StackCrawlMark& stackMark, Int32 创建) +0
System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission 上限、StackCrawlMark 和 stackMark)+61
System.Security.CodeAccessPermission.Assert() +28
System.Data.SqlServerCe.KillBitHelper.GetKillBit() +231
System.Data.SqlServerCe.KillBitHelper..cctor() +56

[TypeInitializationException:'System.Data.SqlServerCe.KillBitHelper' 的类型初始化程序引发异常。]
System.Data.SqlServerCe.KillBitHelper.ThrowIfKillBitIsSet() +0
System.Data.SqlServerCe.SqlCeProviderFactory..cctor() +41

[TypeInitializationException: 'System.Data.SqlServerCe.SqlCeProviderFactory' 的类型初始化器抛出异常。]

[TargetInvocationException:调用目标抛出异常。]
System.RuntimeFieldHandle.GetValue(RtFieldInfo 字段, 对象实例, RuntimeType fieldType, RuntimeType declaringType, Boolean& 域初始化)+0
System.Reflection.RtFieldInfo.InternalGetValue(Object obj, Boolean doVisibilityCheck, Boolean doCheckConsistency) +180
System.Reflection.RtFieldInfo.GetValue(Object obj) +8
System.Data.Common.DbProviderFactories.GetFactory(DataRow providerRow) +232
System.Data.Common.DbProviderFactories.GetFactory(String providerInvariantName) +88
Altairis.Web.Security.DatabaseExtensionMethods.CreateDbConnection(ConnectionStringSettings 设置)在 DatabaseExtensionMethods.cs:19
Altairis.Web.Security.TableMembershipProvider.ValidateUser(字符串 用户名,字符串密码)在 TableMembershipProvider.cs:361

我使用反编译器查看代码,似乎 SQL Server CE 的内部正在寻找注册表项,然后尝试执行代码Assert()。

是否可以在部分信任环境中使用 SQL Server CE 4.0,只需 \bin 部署 DLL??

【问题讨论】:

    标签: asp.net sql-server-ce partial-trust


    【解决方案1】:

    是的,只要您的主机允许 - 在 ASP.NET 4.0 中默认允许。确保您使用程序集版本 4.0.0.0(而不是 4.0.0.1)。在这里阅读更多:http://erikej.blogspot.com/2011/10/sql-server-compact-40-under-aspnet.html

    【讨论】:

    • 我认为您的博客文章中提到了在安装 .NET 4.0 时添加了全局 web.config 文件中 中对 System.Data.SqlServerCe 的引用?还是在安装 SqlServerCe 时?我将不得不与我的主机商核实此部分是否在全局 web.config 文件中...
    • 我刚刚查看了 DLL(右键单击),文件版本是 4.0.8482.1 - 我最近几天才下载了这个版本。您在博客文章中提到了 4.0(不是 4.1)。我是不是也用错了版本??
    • 不是文件版本,是汇编版本,看你Visual Studio项目中的Reference
    • Visual Studio 4.0.0.0 参考版本
    • 我遇到了同样的问题,检查了程序集版本是4.0.0.0。这个答案没有帮助
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多