Windows 服务器 2003,IIS6。
我们正在尝试将非 MVC ASP.NET Web 应用程序部署为 MVC 应用程序的子目录。
但是子目录中的 ASP.NET 应用程序失败,并显示消息“无法加载文件或程序集‘System.Web.Mvc,Version=1.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35’或其依赖项之一。系统找不到指定的文件。”这很奇怪,因为它不是 MVC 应用程序。
答案1
需要更多信息:
子文件夹 ASP.NET Web 应用程序是在其自己的 IIS 应用程序中运行,还是在父级的 IIS 应用程序中运行?
部署在哪
System.Web.Mvc.dll
?
如果 #1 为假(即相同的 IIS 应用程序)那么要求System.Web.Mvc
将从父级继承web.config
。
答案2
我们最终没有解决这个问题,因为我们遇到了一个不同但相关的问题。由于我们的 MVC 应用程序中的路径不使用文件扩展名,因此我们必须安装通配符映射,我们认为这会阻止子目录网站正常运行。
因此,我们将子应用程序移至子域,并在父应用程序的路由中为该子目录添加了重定向。
答案3
我刚刚在非常相似的情况下遇到了不同程序集的相同错误:
- IIS 8.5
- 运行 ASP.NET MVC 应用程序的站点
- 其下有一个虚拟应用程序,
app
在我们的例子中也称为 MVC 应用程序
但在我们的案例中,虚拟应用程序加载失败,因为无法加载Microsoft.Owin.Host.SystemWeb.dll
版本。我们实际上有一个版本在那里,但即使有一个3.0.0.0
3.0.1.0
程序集重定向但这web.config
无济于事。这是根应用程序正在使用版本3.0.0.0
。
在空站点(只是指向一个空文件夹)可以工作。另外,将其作为自己的站点运行也可以。
由于我无法通过给定的设置修复错误,因此我想出了一个不同的解决方案:将根应用程序托管为虚拟应用程序,也一样。
现在,这意味着在一个虚拟文件夹内运行,我们称之为w
。谜题中缺失的部分现在是重写规则将站点根目录映射到该虚拟文件夹w
。我将此规则放入web.config
空站点根文件夹中的新文件中。它如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite / to /w" stopProcessing="true">
<match url="^$" />
<action type="Rewrite" url="/w" logRewrittenUrl="true" />
</rule>
<rule name="Rewrite rest to /w/rest" stopProcessing="true">
<match url="^(/.*)$" />
<action type="Rewrite" url="/w{R:0}" logRewrittenUrl="true" />
<conditions>
<add input="{REQUEST_URI}" pattern="(^w$|^w/)|(^app/)" negate="true" />
</conditions>
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
如您所见,这实际上是两条重写规则,因为我无法仅使用一条重写规则来使其正常工作。在第二条规则中,您可以看到我app
从重写中排除了它,因为我的其他应用程序就位于那里。
以下是我们所拥有的:
- 请求
www.mydomain.com
被重写到www.mydomain.com/w
我们的第一个虚拟应用程序,并随后由该应用程序处理,w
该应用程序曾经是我们的根应用程序 - 请求由我们的虚拟应用程序按预期
www.mydomain.com/app
处理app
我目前仍在努力解决一些静态文件路径未正确重写的问题,但我希望很快解决这个问题。