【问题标题】:Any reference to profilecommon causes error Value cannot be null. Parameter name: type对 profilecommon 的任何引用都会导致错误值不能为空。参数名称:类型
【发布时间】:2010-08-11 02:01:39
【问题描述】:

我已经搜索了两周,每天晚上,详尽地阅读论坛帖子并尝试所有建议的解决方案,无论多么古怪。就像许多关于同一问题的论坛主题一样,该站点在我的开发机器上运行良好。它部署没有错误。它在生产服务器上工作并从数据库中读取数据,但是当它尝试访问配置文件时,它会因此错误而崩溃。

许多帖子说要选中或取消选中名为“删除 app_code.compiled 文件”的选项,但显然这是 Visual Studio 2005 的选项。在 Visual Studio 2010 中找不到它。许多帖子说要确保 App_Code.dll 存在于我的 bin 目录中。它存在。我已经手动删除了 app_code.compile 文件,看看是否有什么不同。我已将目标框架从 4.0 更改为 2.0 和 3.5。我已经在 IIS 中完全删除了该站点,创建了一个具有不同名称的不同文件夹,并使用“允许此预编译站点可更新”和“使用固定命名和单页程序集”的每种组合重新部署了该站点。我已经包含了对 System.Web.Profile 和 System.Web 和 System.Web.Profile.ProfileCommon 的引用。我创建了一个针对 .net framework v4.0 的全新网站,并将该 web.config 文件复制到我的应用程序中,并重新创建了我的配置文件条目,以确保我在此过程中没有在配置文件中添加任何内容。我烧过蜡烛,用过巫毒符咒。我祈祷过。在谷歌和必应的前五页左右,我已经在每个论坛主题上尝试了所有可能的建议,这些建议与此错误有关。我花了 14 天的时间几乎什么都没做,只是试图让这个网站在没有这个错误的情况下出现。

一篇帖子说要确保 bin 目录中存在对 app_code.dll 的引用。我不知道该怎么做,因为它是动态创建的。

有人对此有什么新想法吗?

【问题讨论】:

  • 最好有实际错误和一些示例代码或部分堆栈跟踪。
  • 这是我的想法:向社区乞求点赞,这样你就可以把它们当作赏金。
  • 你有更详细的异常信息,包括堆栈跟踪吗?
  • 在您关于同一问题的另一篇文章中,您说这适用于 Casini ...如果您在开发机器上切换到 IIS 会怎样?
  • 上周遇到了类似的问题 - 将 ASP.Net 网站项目转换为 Web 应用程序。在前者中,配置文件在 web.config 中以声明方式定义。但是,Web 应用程序项目无法访问动态生成的 app_code DLL(因为它直到运行时才由 .Net 构建)。解决方法是访问配置文件的属性: ComplexProfileProperty _cpp = (ComplexProfileProperty)HttpContext.Current.Profile.GetPropertyValue("valuename"); Hth,抱歉,如果我完全误读了您的问题 - 没有代码示例很难确定 :-)

标签: c# asp.net vb.net visual-studio-2010


【解决方案1】:

好的,我一直在对这个主题进行大量阅读和试验,并且我认为我已经收集和编译了足够的信息来帮助那些可能通过搜索这个错误而偶然发现这个线程的人。我要做的只是提供一个通俗的解释,然后是几个非常相关的信息的链接。

Visual Studio 支持两种不同的网页设计方法; Web 应用程序和网站。在 2005、2008 和 2010 年都是如此。显然,这种设计原则的划分源于 Visual Studio 2003 仅支持 Web 应用程序模型,并且该模型随着 Visual Studio 2005 的发布而改变,然后为了使设计原则与以前的版本保持一致,Web 应用程序方法被添加到 Visual Studio 2005 中,为显然具有可敬技能水平的开发人员创造了一个非常令人困惑的分支。

我不会详细介绍这两个模型之间的差异。这篇文章底部的链接中有很多细节。但可以说,使用 Web 应用程序功能不支持开箱即用的配置文件。

此外,让事情变得更加混乱,这就是让我感到困惑的原因,如果网站是通过“构建”->“发布网站”菜单选项发布的,配置文件将无法与网站模型一起使用,除非(也许) 首先手动预编译,然后通过“复制站点”或 FTP 或您使用的任何方式复制预编译的 dll。预编译显然是通过命令行完成的。我有一个链接,其中包含有关如何在下面执行此操作的说明。但同样,我自己没有测试过,所以我不知道它是否有帮助。

它配置文件不适用于 Build -> Publish Web Site 部署方法的原因是,当 IIS 第一次动态编译您的页面时,ProfileCommon 类是使用您在 Web 配置中定义的配置文件属性动态构建的被访问。如果您使用“构建 -> 发布网站”选项,它会很好地编译您的 DLL,但不会为您创建此类。

老实说,我不确定为什么首先在网站模型中包含构建 -> 发布网站选项。从我读过的所有内容来看,Web 站点与 Web 应用程序模型的关键在于使 ASP.net 体验更像是传统的 Web 开发体验,您的文件可以在您的机器上编辑并通过 FTP 传输到服务器或可以只需在服务器上进行编辑。是的,它们必须在被访问之前进行编译,但是这种编译,按照设计,是动态发生的,而且,显然,如果你先编译站点然后上传它,你编译它而不动态创建 ProfileCommon 类,因此有效地拿走了一个asp.net 网站设计方法的强大功能。

在很多帖子中,人们表达了对其代码安全性的担忧,因为使用网站模型并将其文件复制到服务器进行动态编译意味着带有源代码的文件以预编译的形式存放在服务器上状态。但是,我只是看不出这与任何其他更传统的 Web 脚本语言(如 Perl、PHP 甚至经典 ASP)之间没有区别。在这些语言中,代码同样易受攻击。任何代码在配置错误的服务器上都容易受到攻击。此外,即使您的代码已编译,具有绕过配置良好的 IIS 服务器的安全性并获取源文件的技能的黑客也可以获取已编译的文件,然后通过 ILDASM 运行它们。所以除非他们被专业混淆,否则有什么区别?

因此,根据我的发现,如果您想在您的 asp.net 网站上使用配置文件,请将您的网站创建为网站项目与 Web 应用程序项目并将其复制到您的服务器而不是通过发布它构建菜单。您可能可以预编译它然后发布它(不确定那个),但我知道只需复制它并让它动态编译就可以了。

如果我遗漏了什么并且有另一种方法,我很乐意阅读它。同时这里有一些非常有用的链接。非常感谢 5arx 让我走上这条道路:

http://www.codersbarn.com/post/2008/06/ASPNET-Web-Site-versus-Web-Application-Project.aspx

http://msdn.microsoft.com/en-us/library/dd547590.aspx

http://msdn.microsoft.com/en-us/library/ms227972.aspx

【讨论】:

    【解决方案2】:

    您是说您无法通过代码访问个人资料吗?如果是这样,您可以发布一些代码/伪代码吗?我认为这是我上周遇到的一个问题(并已修复)... – 11 分钟前 5arx

    上周遇到了类似的问题 - 将 ASP.Net 网站项目转换为 Web 应用程序。在前者中,配置文件在 web.config 中以声明方式定义。然而,Web 应用程序项目无法访问动态生成的 app_code DLL(因为它直到运行时才由 .Net 构建)。解决方法是访问配置文件的属性:

    ComplexProfileProperty _cpp = (ComplexProfileProperty)HttpContext.Current.Profile.GetPropertyValue("valuename");

    第,

    如果我完全误读了您的问题,我们深表歉意 - 没有代码示例很难确定 :-)

    【讨论】:

    • 听起来你可能在正确的轨道上 5arx。我很高兴有任何新的尝试。你知道,关于 .net 环境,我不能完全清楚网站和 webapp 之间的区别。我知道在我的站点中,app_code.dll 在站点发布到服务器之前不会构建。我可以简单地将站点复制到服务器位置并且它可以工作(就像它在我的开发机器上一样)并且存在可疑的 app_code.dll。当我发布时,它会自动生成 app_code.dll,并且该站点会因此错误而崩溃。我今晚回家后会发布代码
    • 我从未意识到 ASP.net 中站点模型和应用程序模型之间的区别。这是一篇包含许多链接的文章,应该对遇到此问题的任何人有所帮助。 codersbarn.com/post/2008/06/01/…。我已经返回并在 VS 中创建了一个空的应用程序和站点,以验证我的确实是一个“站点”。我可以将站点复制到服务器并且它可以工作。如果我“发布”它不会。我开始认为这是意料之中的,并且“副本”可能更适合网站。经过更多研究后,我将发布答案。
    • 也看看这些:vishaljoshi.blogspot.com/2009/08/…stackoverflow.com/questions/590501/…。显然,如果您正在进行任何有意义的开发并且需要能够对命名空间进行单元测试和管理,那么 Web 应用程序项目是唯一的选择。
    【解决方案3】:

    我假设您已经查看了文档 - hereherehere

    这听起来像是我在尝试访问/设置匿名用户的属性时遇到的一些错误。有很多事情是 anon 无法完成的。用户。

    是否还有其他与个人资料/会员资格相关的错误?这可能是数据库表或应用程序 ID/用户 ID 的问题。 Context.Request.AnonymousID 不一定反映数据库中的任何内容,从我发现调试配置文件问题的情况来看。

    如果你真的卡住了,你可能想尝试获取source for the .Net Framework,并对其进行调试。

    【讨论】:

    • 堆栈跟踪:[ArgumentNullException:值不能为空。参数名称:type] System.Activator.CreateInstance(Type type, Boolean nonPublic) +9643414 System.Web.Profile.ProfileBase.CreateMyInstance(String username, Boolean isAuthenticated) +79 System.Web.Profile.ProfileBase.Create(String username, Boolean isAuthenticated) +247 System.Web.HttpContext.get_Profile() +107 _perfect.get_Profile() +20 _perfect.Page_Load(Object sender, EventArgs e) +249 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o , 对象 t, EventArgs e) +14
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2013-03-23
    • 2017-06-06
    相关资源
    最近更新 更多