为同一域中的多个WCF服务组织程序集

时间:2011-04-07 21:55:35

标签: wcf assemblies bin

那么,当服务可能使用相同引用程序集的不同版本时,问题是如何为同一域中托管的多个 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中的顺序解析上面的字符串然后它会使用错误的程序集我猜?然后它毕竟不是完全孤立的。

如果我在这个假设中是对的,那么也许强命名就是答案?

再次感谢,雅各布。

1 个答案:

答案 0 :(得分:0)

我相信你需要的是Service Versioning,而不是探究。

您的客户端需要通过网络使用相同服务的不同版本。这是一个常见问题,可通过服务版本控制解决。所以他们没有引用DLL,他们连接到服务。

因此,您只需创建新版本,部署到新端点并使用新服务获取新客户端。