首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SqlRoleProvider on IIS8 Express

SqlRoleProvider on IIS8 Express
EN

Stack Overflow用户
提问于 2012-10-22 12:16:34
回答 3查看 748关注 0票数 3

我的web应用程序( WCF服务)使用SqlRoleProvider,它在上工作得很好。但是,切换到IIS8 Express会导致它抛出一个NullReferenceException

代码语言:javascript
复制
Roles.IsUserInRole(username, role) // neither of them actually null

我在 method documentation中找不到这个异常的提示。切换回使其工作。造成这种异常的原因是什么,我如何才能正确地解决它?该项目的目标框架是.NET框架4。

以下是配置的连接字符串:

代码语言:javascript
复制
<add name="ConnectionString"
      connectionString="Data Source=.\sqlexpress;Initial Catalog=DevWeb;Integrated Security=True"
      providerName="System.Data.SqlClient" />

这是roleManager/providers节点:

代码语言:javascript
复制
<clear />
<add connectionStringName="ConnectionString" applicationName="MyApp" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider"/>
EN

回答 3

Stack Overflow用户

发布于 2013-11-27 23:23:56

弗拉基米尔说的是真的,但实际上并没有解释正在发生的事情。抛出NullReferenceException的是IsUserInRole和GetRolesForUser中的EtwTrace代码。Roles类中的其他所有内容都说明了HttpContext.Current可以为null。我通过查看中的“.NET,Version4.5”在http://referencesource.microsoft.com/netframework.aspx上找到了这一点。

在我尝试过的所有其他测试环境中,跟踪级别都不足以触发NullReferenceException。只有在安装Visual 2013之后使用IIS Express 8时,我才看到这个问题,而且只在IIS Express中看到了这个问题。

看你怎么办?

一种选择是为WCF启用"ASP.Net兼容性模式“。首先,在web.config中,将属性aspNetCompatibilityEnabled="true“添加到节点。然后,通过将属性System.ServiceModel.Activation.AspNetCompatibilityRequirements(RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Allowed)添加到启用了该功能的类definition.With中,将服务类添加到行为中,在您从角色类请求角色时填充HttpContext.Current,前提是您没有处理弗拉基米尔提到的后台线程(在这种情况下,您需要先修补HttpContext.Current )。您可以在ASP.NET上阅读更多关于http://blogs.msdn.com/b/wenlong/archive/2006/01/23/516041.aspx的WCF兼容性模式的内容。

另一种选择是绕过这两个方法的角色类。与其调用Roles.IsUserInRole,不如调用Roles.Provider.IsUserInRole。与其调用Roles.GetRolesForUser,不如调用Roles.Provider.GetRolesForUser。每个方法都具有相同的可用重载。您将丢失跟踪停止和本地角色缓存,但您将绕过空引用异常。

票数 4
EN

Stack Overflow用户

发布于 2013-05-22 13:47:31

如果在不同线程中调用Roles.IsUserInRole,则应该检查HttpContext。在这种情况下将是空的。因此,为了修复,您应该将HttpContext从主线程复制到子线程。

代码语言:javascript
复制
        var context = HttpContext.Current;
        Thread thread = new Thread(delegate() {
            if (HttpContext.Current == null)
                HttpContext.Current = context;
        });

        thread.Start();
票数 1
EN

Stack Overflow用户

发布于 2012-10-22 12:24:25

相当肯定,您的问题将与数据库和帐户访问它的权限有关。尝试将IIS帐户添加到sa priv,并查看问题是否已解决。如果是的话,你就失去了许可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13011291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档