【发布时间】:2011-04-07 21:55:34
【问题描述】:
那么,问题是当服务可能使用相同引用程序集的不同版本时,如何为托管在同一域中的多个 WCF 服务组织程序集?
问题是,我有一系列当前托管在同一域中的 WCF 服务,但由于我不能这样做时一定不要破坏其他服务。因此,它要求我将所有其他服务与我要发布的新版本的程序集或程序集一起更新。
更新服务 - 在我的情况下 - 将更改 bin 文件夹中的一个或多个程序集。问题是其他服务可能需要相同的程序集。我希望能够使用服务名称定义子文件夹,并且在每个文件夹中都有一个 bin 子文件夹、.svc 文件和所有其他内容与服务有关。这样我就可以将服务隔离在同一个域中。
我已经搜索了一个解决方案,并找到了一篇由 Scott Hanselman 撰写的关于探测的博文,但它似乎适用于 .NET 1.1、ASP .NET...
http://www.hanselman.com/blog/PermaLink.aspx?guid=4d0ef4fb-f8ae-4355-a658-3c0432c98dbe
不幸的是,我无法让它适用于我的场景 (.NET 4.0)。此外,我不确定这是否会按我需要的方式进行扩展。即使我可以让它工作,那么它是否会是单独的 AppDomains,如果不是,那会是一个问题吗?我需要完全隔离服务,但仍托管在同一个域中。
谢谢,雅各布。
更新
实际上,我走得更远了。我试着把[ServiceName].svc.cs和接口放到自己的工程中编译,然后稍微修改.svc文件,引用刚才的程序集按照 Hanselman 的描述创建。如果我省略了他的帖子中也提到的 Import 语句并同时做其他部分,那么它确实有效。
唯一的事情是,如果我有一个路径列表,比如...
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Tasks\bin;Products\bin"/>
</assemblyBinding>
</runtime>
...那么我可以确定使用的程序集来自正确的文件夹,而不是按照它们在列表中出现的顺序解析吗?例如,如果 ProductsService 使用与 TaskService 相同的程序集但版本不同,那么如果程序集按照它们出现在 privatePath 中的顺序进行解析 上面的字符串,那么我猜它会使用错误的程序集吗?那么它毕竟不是完全孤立的。
如果我在这个假设上是对的,那么也许强命名就是答案?
再次感谢雅各布。
【问题讨论】:
-
不能只创建子应用程序吗?
http://myendpoint.mycompany.com/Tasks/TaskService.svc和http://myendpoint.mycompany.com/Products/ProductsService.svc?这样他们就不会互相干扰了。 -
谢谢,约翰,很抱歉没有很好地解释它。你的建议是我实际在做的事情。每个服务都有一个子文件夹,但是,程序集仍然必须驻留在根目录的 bin 文件夹中。也许令人困惑的是,它不仅是服务的程序集,也是我自己的库,例如MyCompany.Security.dll、MyCompany.Web.dll等,在不同版本的服务中都可以引用。无论如何,谢谢,雅各布。
-
@Jacob:每个文件夹创建一个项目 - 每个项目都是 IIS 应用程序,因此每个项目都有自己的 bin 文件夹。他们仍然可以共享通用代码。
-
嗨,约翰。一个VS项目?你的意思是我应该把我的所有代码都放在一个 DLL 中吗?如果是这样,那将不是最佳解决方案,因为我的代码在引用的库中组织良好。或者你的意思是在同一个虚拟文件夹下做单独的虚拟文件夹或类似的东西?
-
@Jacob:每个服务一个项目,项目可以引用库,可以保持井井有条。
标签: wcf assemblies bin