[iis]" 无法加载 App_Web_*.dll " asp.net 编译和循环后的异常

标签: IIS dll
发布时间: 2011/5/31 18:25:14
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我最近碰到的结构如下代码:

  • FooService.cs
  • FooService.svc
  • Default.aspx

文件的内容:

[FooService.cs]

using System.ServiceModel;

namespace FooService
{
    [ServiceContract]
    public class FooService
    {
        static FooEngine engine = new FooEngine();

        [OperationContract]
        public string Foo()
        {
            return "bar";
        }
    }

    public class FooEngine
    {

    }
}

[FooService.svc]

<%@ ServiceHost Language="C#" Service="FooService.FooService" %>

[Default.aspx]

<%@ Page Language="C#" %>
<% var foo = "bar"; %>

我们使用。网 4.0 (调试) 和 IIS6 'fooservice' web 与 hostfile 条目的 Windows Server 2003 上调用 web 服务通过 url=http://fooservice/FooService.svc" rel="nofollow">http://fooservice/FooService.svc 和 default.aspx http://fooservice/通过。一切都在此时完美。

不过,在以下步骤中后

  1. Default.aspx,保存文件中的代码更改
  2. 加载 http://fooservice/ (触发器 asp.net 编译)
  3. 回收应用程序池

http://fooservice/FooService.svc 调用失败并引发了以下异常

[FileNotFoundException: Could not load file or assembly 'App_Web_ynlv0b1k, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.]
   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0
   System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +39
   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) +132
   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +144
   System.Reflection.Assembly.Load(String assemblyString) +28
   System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) +208
   System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath) +1440
   System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +44
   System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +615

[ServiceActivationException: The service '/FooService.svc' cannot be activated due to an exception during compilation.  The exception message is: Could not load file or assembly 'App_Web_ynlv0b1k, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified..]
   System.Runtime.AsyncResult.End(IAsyncResult result) +679246
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +190
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, String routeServiceVirtualPath, Boolean flowContext, Boolean ensureWFService) +234
   System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +355
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

究竟什么在这里?

备注

  • 我了解 asp.net 正在编译并加载一个新的 App_Web_*.dll (在步骤 2),但它为什么尝试加载旧 (删除) App_Web_*.dll 后回收 (3)。 吗?
  • 使用完全相同内联代码在 FooService.svc 的一个单独的而不是 FooService.cs 并不存在这个问题 (?)
  • 删除静态引用 FooEngine 也使这个问题去走 (?)

解决方法 1:

代码不应以下结构:

  • FooService.cs
  • FooService.svc
  • Default.aspx

但以下内容:

  • App_Code/FooService.cs
  • FooService.svc
  • Default.aspx

请特别注意 App_Code 文件夹中包含的源代码。

总括来说:

~/App_Code/FooService.cs:

using System.ServiceModel;

namespace FooService
{
    [ServiceContract]
    public class FooService
    {
        static FooEngine engine = new FooEngine();

        [OperationContract]
        public string Foo()
        {
            return "bar";
        }
    }

    public class FooEngine
    {

    }
}

~/FooService.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="FooService.FooService" CodeBehind="~/App_Code/FooService.cs" %>

~/Web.config:

<configuration>
  <system.web>
    <compilation debug="false" targetFramework="4.0" />
  </system.web>

  <system.webServer>
     <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
</configuration>

~/Default.aspx:

<%@ Page Language="C#" %>
<% var foo = "bar"; %>

此说我会推荐您使用 Web 应用程序,而不是 Web 站点 ,并预编译一切可能避免这类问题。另一个优点是您不再需要部署在服务器上的源代码。

如果您使用 percompiled web 应用程序中您的结构将以下内容:

  • bin/MyWebService.dll
  • FooService.svc
  • Default.aspx

这是我会建议你。

解决方法 2:

我们已经看到在某些情况下应用程序循环从来没有真正执行。我看见这是较重负载下的较大的站点。IIS 使用相当激进的缓存机制,并且取决于请求队列长度不会实际强制完整的循环。

如果你看到这,然后尝试执行 IISRESET /noforce。这应该告诉真的真的回收所有服务器。

解决方法 3:

您好 !

您可以设置 IIS 应用程序池回收在某个时间段或某些应用程序故障。请检查以下 Url,可以帮助您:

http://forums.asp.net/p/1551597/3934757.aspx http://weblogs.asp.net/albertpascual/archive/2010/07/01/installing-asp.net-4-in-iis-6.aspx

马尼亚尔弗 MCP |MCSE |MCST |MCITP |ITILv3 认证

解决方法 4:

FooEngine 也许被有关问题吗?错误将重现,如果在您的示例更改为对象的 FooEngine 吗?

解决方法 5:

这似乎是用 asp.net 编译器的问题。似乎不更新临时 asp.net WCF 与新的 DLL 文件的基础重新编译。你可以请测试批处理应用程序即为 false < 编译批处理 ="false">

赞助商