在我的托管应用程序中,我目前将 WCF 服务运行为:
SomeService service = new SomeService(container) //IUnityContainer
ServiceHost serviceHost = new ServiceHost(service, serviceAddress);
有什么问题? SomeService 定义为:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single
这不再好了,我需要使它成为 InstanceContextMode.PerCall 。
尝试 .Open() 时如果将 InstanceContextMode 更改为“PerCall” - 它会抛出:
System.InvalidOperationException: In order to use one of the ServiceHost constructors that takes a service instance, the InstanceContextMode of the service must be set to InstanceContextMode.Single. This can be configured via the ServiceBehaviorAttribute. Otherwise, please consider using the ServiceHost constructors that take a Type argument
这是我的问题的解决方案吗? How do I pass values to the constructor on my wcf service?
我的主要关注点:
我在这个托管应用程序中运行不同类型的服务,似乎只有当我运行一种类型的服务时,这个解决方案才是好的。
最佳答案
当需要多个服务实例(PerCall 或 PerSession)时,将单个服务实例传递到 ServiceHost 是不够的……这是异常(exception)。
控制实例创建由 IInstanceProvider 管理。
这只能回答你一半的问题。您正在使用 Unity。创建容器的管理需要成为实现的一部分。最常见的解决方案是使用 Unity.WCF,它也可用作 NuGet 包。
请注意,Unity.WCF 不支持基于对象生命周期的 WCF OperationContext。有多个(更复杂的)实现,比如 this 可以做到。
关于c# - 带有 DI 和 InstanceContextMode.Percall 的自定义 ServiceHost,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16919969/