【问题标题】:How to utilize WebDev.WebServer.exe (VS Web Server) in x64?如何在 x64 中使用 WebDev.WebServer.exe (VS Web Server)?
【发布时间】:2010-10-24 15:36:01
【问题描述】:

Visual Studio 是 x86 直到 至少 2010 版本发布 更新:这在 VS2010 中仍然是一个问题,没有原生 64 位 Cassini 支持。我的问题是任何人都可以想到一种方法或知道一个独立的 ASP.NET 调试服务器,它是 2008 年或 2010 年的 x64?

背景:我们的 ASP.NET 应用程序针对 Oracle 作为数据库运行。由于稍后我们在 64 位服务器上处理内存问题,因此我们需要使用 Oracle 的 64 位驱动程序(Instant Client)。

设置:

  • x64 操作系统(XP 或 Windows 7)
  • IIS(6 或 7,均为 x64 应用程序池)
  • Oracle 64-bit Instant Client(单独的目录,在 PATH 中)
  • Visual Studio 2008 SP1 Visual Studio 2010

在 IIS 中,应用程序池以 64 位运行,按预期使用 Oracle 驱动程序,但是由于 WebDev.WebServer.exe 是 32 位,您将获得 BadImageFormatException 因为它试图在 32 位环境中加载 64 位驱动程序 DLL。我们所有的开发人员都希望能够通过 Visual Studio 2008 使用快速调试服务器,但由于它以 32 位运行,我们无法做到。我们遇到的一些问题是在应用程序启动期间,因此虽然我们有时会附加到 IIS 进程,但这还不足以追踪问题。

是否有任何替代方案或解决方法?我们希望尽可能匹配我们的 Dev/Val/Prod 层,因此在 x64 中运行的一切都是理想的。


VS 2010 更新

自从第一次发布这个问题以来,对这个问题进行了很多更改,第一个 VS2010 现已发布,这里仍然存在相同的问题,但我所在的项目没有。我们经历了 2 次更改来解决这个问题,所以我会发布这些内容,希望它可以减轻其他人的痛苦:

第一个解决方案是在 32 位以上加载 Oracle x86,在 64 位模式下加载 x64,我们通过 web.config 在 64 位下运行时替换程序集引用来做到这一点,如下所示:

<configuration>
  <runtime>
    <assemblyBinding>
      <dependentAssembly>
        <assemblyIdentity name="Oracle.DataAccess" publicKeyToken="89b483f429c47342" processorArchitecture="amd64" />
          <bindingRedirect oldVersion="2.0.0.0-10.9.9.9" newVersion="2.102.3.2" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

这里的关键是processorArchitecture="amd64",这意味着只有在64位下运行时才会发生替换。

请注意,这些版本现在可能已经过时(如果您正在阅读这篇特别关注 Oracle 的文章),这是不久前的事了。除了配置,我们还加载了Oracle.DataAccessinto the GAC 的 32 位和 64 位版本。 Oracle 10g 的 32 位版本是 10.xxx,64 位版本是 2.1xxx,所以只需 swapping the binding using &lt;assemblyBinding&gt; works

第二个更长期的解决方案是完全脱离 Oracle 客户端,我们现在使用 dotConnect for Oracle 作为我们的 Linq-to-SQL 提供程序,因为它是使用直接 TCP 连接的完全托管代码,所以我们有应用程序中不再有 32/64 位特定代码,这非常更易于维护。

我希望发现此内容的人也发现后续内容也很有用。如果您对我最终使用的任一解决方案有任何疑问,请发表评论,我会尝试更详细地解释。

【问题讨论】:

  • 您是否在 Stack Overflow 之外找到了这个问题的答案?
  • 我没有...从我所读到的内容来看,由于附加移植问题并且没有进一步破坏它们,因此没有计划以原生 x64 风格制作 VS 2010比 2008-2010 年的升级。目前我在 32 位模式下运行不同的 PATH 变量,因此 VS 的 Web 服务器会看到不同的 Instant Client 目录。这让我可以同时拥有一个 x64 和 x86 即时客户端,并且两者都可以工作。这并不完全理想,因为我仍然必须附加到 x64 IIS 进程来调试任何可能与 x86/x64 兼容性相关的问题,但它更适合正常开发。

标签: asp.net oracle 64-bit webdev.webserver


【解决方案1】:

两个想法:

  1. 使用来自Mono 项目的XSP 拼凑一些东西。
  2. 在完全 32 位环境中测试,部署到 64 位环境。

【讨论】:

  • XSP Web 解决方案是迄今为止最有希望的可能性,现在正在对其进行更多研究。第二个选项不起作用,因为难以调试的问题是在启动时。如果驱动程序、库等不是 64 位友好的并且在启动时崩溃,则很难判断这一点,因为在大多数情况下,我既无法连接调试器,也无法获得错误屏幕。示例:服务器未正确安装,即时客户端 x86 DLL 已部署并由 x64 路径变量获取,反之亦然。
  • 考虑到我们当前的 linq 模型,Mono 的效果很好,尤其是在测试方面。当我们得到 100% 满足我们所有需求的构建时,我会跟进以防其他人遇到同样的困境。感谢您提供 XSP 提示,这并不是我们最终的结果,而是一个很好的起点。
【解决方案2】:

您可以尝试从 source 编译 64 位 Cassini。

【讨论】:

  • 我就是这样做的。 (我认为有人的努力被称为 cassinidev)而且效果很好!比运行 64 位 IIS imo 更适合调试。
【解决方案3】:

在本地计算机上使用 IIS。

【讨论】:

  • 无法在 64 位模式下调试应用程序启动是发布问题的全部原因......
  • 也许我误解了它,但是是什么阻止您使用 IIS 而不是 WebDev.WebServer.exe?
  • 如果应用程序在 VS 调试器挂钩之前启动并崩溃(这是 / 是我们在 x86/x64 dll 中遇到的一个错误的情况),它无助于我们找出问题。对于正常的开发,我确实使用 IIS,只是任何启动问题都很难调试。
  • 不能在 IIS 调试时执行的第一行代码设置断点?
  • 就是这样,这通常是框架中的 DLL 加载问题,然后您可以安装调试器的一行代码被击中……这些是混合 x86 中最有可能出现的问题/x64 环境...使用 IIS 作为应用程序主机时最难调试。
【解决方案4】:

即使您使用的是 64 位环境,在 Visual Studio 中临时引用 32 位 dll(或手动将其复制到 BIN 文件夹中)以便您可以调试它。请记住,每次编译代码时,它都会重新复制 BIN 文件夹中的 64 位程序集。

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多