2012-02-22 19 views
1

我使用Unity来解析我的实例。包括WCF服务。在WAS回收应用程序池之后,使用Unity来解析实例将失败

但我发现了一个诡计问题。 我将我的WCF程序部署到IIS(WAS),并且可以运行我的Web服务。

IIS(WAS)回收应用程序池后,我确定我的注册码已执行。 但现在web服务抛出一个异常,说

“异常发生while:解决。”

然后我从IIS服务登录信息,它说我不注册这种类型。

+0

现在我检查Unity容器的注册,注册类型和映射类型都存在于统一容器注册集合 – metavige 2012-02-22 07:47:01

+0

如何将Unity与WCF集成?通过一个自定义的'ServiceHostFactory'或其他东西?你是否在抛出异常的同一线程上检查注册? WCF本质上是多线程的,如果你的注册码没有在正确的线程上运行,可能会导致问题。 – 2012-02-22 10:07:23

+0

是的,我使用ServiceHostFactory并实现一个InstanceProvider。在InstanceProvider内部,我使用UnityContainer创建服务实例。 但我注册接口及其实现类型,在bin目录中使用程序集,而不是在Asp.Net模板文件夹中组装。 – metavige 2012-02-23 06:54:41

回答

3

我自己解决了这个问题。

当应用程序池回收并创建一个新的应用程序池时,所有的DLL都会复制到一个新的Asp.Net模板文件夹中。

当我强制将所有“bin”DLL加载到AppDomain时,我在bin的程序集中注册了一个类型。不在Asp.net Temp Folder组件中。所以Unity认为它是差异类型。

现在我改变加载组件当前域

string binPath = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "bin"); 
foreach (string dll in Directory.GetFiles(binPath, "*.dll", SearchOption.AllDirectories)) 
{ 
    var assemblyFromCurrentDomain = Assembly.Load(Assembly.LoadFile(dll).FullName); 

    Debug.Print("Add Assembly : {0}, {1}", assemblyFromCurrentDomain.FullName, assemblyFromCurrentDomain.Location); 
} 

然后问题固定的方式。

相关问题