如何在 x64 中使用 WebDev.WebServer.exe(VS Web Server)?

发布于 2024-07-20 18:23:24 字数 2515 浏览 9 评论 0原文

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

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

设置:

  • x64 操作系统(XP 或 Windows 7)
  • IIS(6 或 7,均为 x64 应用程序池)
  • Oracle 64 位即时客户端(独立目录,位于 PATH 中)
  • Visual Studio 2008 SP1 Visual Studio 2010

在 IIS 中,应用程序池以 64 位运行,按预期使用 Oracle 驱动程序,但是由于 WebDev.WebServer.exe 是 32 位,因此您将收到 BadImageFormatException,因为它尝试加载 64 位驱动程序 DLL 32 位环境。 我们所有的开发人员都希望能够通过 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),那是很久以前的事了。 除了配置之外,我们还加载了 32 位和 64 位版本的 Oracle.DataAccess 进入 GAC。 Oracle 10g 的 32 位版本为 10.xxx,64 位版本为 2.1xxx,因此只需 使用 交换绑定有效

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

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

Visual Studio is x86 until at least the 2010 release comes around update: this is still an issue in VS2010, there is no native 64bit Cassini support. My question is can anyone think of a way or know of an independent ASP.NET debug server that's x64 for 2008 or 2010?

Background: Our ASP.NET application runs against Oracle as the DB. Since we're on 64-bit servers for memory concerns later, we need to use Oracle's 64-bit drivers (Instant Client).

Setup:

  • x64 OS (XP or Windows 7)
  • IIS (6 or 7, both x64 App Pools)
  • Oracle 64-bit Instant Client (Separate Directory, in the PATH)
  • Visual Studio 2008 SP1 Visual Studio 2010

In IIS the application pool runs as 64-bit, uses the Oracle drivers as intended, however since WebDev.WebServer.exe is 32-bit you'll get a BadImageFormatException because it's trying to load 64-bit driver DLLs in a 32-bit environment. All of our developers would like to be able to use the quick debug server via Visual Studio 2008, but since it runs as 32-bit we're unable to. Some problems we run into are during application startup, so although we're attaching to the IIS process sometimes that isn't enough to track an issue down.

Are there any alternatives, or work-arounds? We would like to match our Dev/Val/Prod tiers as much as possible, so everything running in x64 would be ideal.


Update for VS 2010

A lot of changes to this question since it was first posted, first VS2010 is out now, it still has the same issues here, however the project I'm on does not. We went through 2 changes to solve this, so I'll post these in hope it saves someone else grief:

The first solution was to load Oracle x86 in 32-bit more, x64 in 64-bit mode, we did this by replacing the assembly reference when running under 64-bit via the web.config, like this:

<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>

The key here is the processorArchitecture="amd64", this means the replacement only happens when running under 64-bit.

Note these versions may be out of date now (if you're reading this caring about Oracle specifically), this was a while back. In addition to the config, we loaded the 32-bit and 64-bit versions of Oracle.DataAccess into the GAC. The 32-bit versions are 10.xxx for Oracle 10g, the 64-bit versions are 2.1xxx, so just swapping the binding using <assemblyBinding> works.

The second, more long-term solution was moving off the Oracle client completely, we're now using dotConnect for Oracle for our Linq-to-SQL provider, and since it's completely managed code using a direct TCP connection, we have no more 32/64-bit specific code in the application, which is much easier to maintain.

I hope whoever finds this also finds the follow-up useful as well. If you have questions about either solution I ended up using, please comment and I'll try and explain in more detail.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

木落 2024-07-27 18:23:24

两个想法:

  1. Mono 项目中的 XSP 拼凑在一起。
  2. 在完全32位环境中测试,部署到64位环境。

Two ideas:

  1. Cobble something together with XSP from the Mono project.
  2. Test in a totally 32bit environment, deploy to a 64bit environment.
狼性发作 2024-07-27 18:23:24

您可以尝试从 来源

You could try to compile a 64-bit Cassini from source.

拥抱影子 2024-07-27 18:23:24

在本地计算机上使用 IIS。

Use IIS on your local machine.

祁梦 2024-07-27 18:23:24

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

Even you are using 64-bit environment, temporary refer 32-bit dlls in Visual studio (or manual copy it in BIN folder) so that you can debug it. Keep in mind, every time you compile the code it will re-copy the 64-bit assemblies in BIN folder.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文