2011-04-07 89 views
1

问题是,当服务可能使用同一个引用程序集的不同版本时,如何组织同一个域中托管的几个服务的几个组件:在同一个域中组织几个WCF服务的组合

事情是,我有一系列的WCF服务目前托管在同一个域中,但由于我无法确定不会中断其他服务。因此,它要求我将所有其他服务与我将要发布的新版本程序集或程序集保持同步。

更新服务 - 在我的情况下 - 将更改bin文件夹中的一个或多个程序集。问题是其他服务可能需要相同的程序集。我想有可能使用服务的名称定义子文件夹,并且在这些文件夹中的每个文件夹中都有一个bin子文件夹,.svc文件以及与该服务相关的所有其他内容。这样我可以隔离相同域中的服务。

...我已经寻找一个解决方案,我发现博客中通过斯科特Hanselman的约探测,但它似乎适用于.NET 1.1ASP.NET ...

http://www.hanselman.com/blog/PermaLink.aspx?guid=4d0ef4fb-f8ae-4355-a658-3c0432c98dbe

不幸的是,我不能让它适用于我的方案(.NET 4.0)。此外,我不确定这会以我需要的方式扩展。即使我可以使它工作,那么它会是分开的AppDomains,如果不是这将是一个问题?我需要完全隔离该服务,但仍然托管在同一个域中。

谢谢,雅各布。

更新

其实,我还得到了一点。我试图把[服务名称] .svc.cs和接口转换成自己的项目并对其进行编译,然后稍微改变.SVC文件引用由Hanselman在描述刚刚创建的组件。如果我遗漏了他在帖子中提到的导入声明并且做了其他的位,那么它实际上是有效的。

的唯一的事情是,如果我有路径,像一个列表...

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="Tasks\bin;Products\bin"/> 
    </assemblyBinding> 
</runtime> 

...那么我可以确保使用的组件是从正确的文件夹,并没有解决它们出现在列表中的顺序?一个例子是,如果ProductsService使用相同的组件TaskService但在不同的版本,那么如果组件在它们出现在privatePath串上面的顺序,然后它会使用错误的组装我想解决?那么它毕竟不是完全孤立的。

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

再次感谢Jacob。

+0

难道你不能只创建子应用程序吗? 'http:// myendpoint.mycompany.com/Tasks/TaskService.svc'和'http:// myendpoint.mycompany.com/Products/ProductsService.svc'?然后他们不会互相干扰。 – 2011-04-07 23:20:19

+0

谢谢,约翰,抱歉没有解释得不够好。你所暗示的是我实际上在做什么。但是,每个服务的一个子文件夹仍然必须驻留在根的bin文件夹中。也许令人困惑的是,它不仅仅是服务的组装,它也是我自己的库,例如MyCompany.Security.dll,MyCompany.Web.dll等,它们可以在不同版本的服务中引用。无论如何,谢谢雅各布。 – Jacob 2011-04-08 07:09:10

+0

@Jacob:为每个文件夹创建一个项目 - 每个项目都是IIS应用程序,因此每个项目都有自己的bin文件夹。他们仍然可以共享通用代码。 – 2011-04-08 15:37:07

回答

0

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

你有客户这就需要在网络上使用不同版本的同一服务的。这是一个常见问题,由服务版本解决。所以他们没有引用DLL,他们连接到服务。

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

+0

谢谢,但它实际上是不同的服务,不只是不同的版本,例子可能是一个TaskService,一个ProductService,一个EmailService等,谢谢。其实我觉得我有点进一步了。在几分钟内查看原始文章中的更新... – Jacob 2011-04-07 22:30:23