使用ServiceHost类及其构造函数了解WCF自托管方法

And*_*dry 4 .net c# service wcf

我对WCF中的服务托管有一些疑问.

我想使用自托管方法托管服务. ServiceHost上课来救援.通过使用它,可以托管可直接访问Windows主机框架的服务.那么,请考虑以下方法:

0)常见假设:所有情况都假设使用配置文件App.config来设置端点的ABC.所以在下面的代码中没有提到端点,只是不要理会它.我们也会考虑这项服务:

[ServiceContract]
public interface IMyService {
   [OperationContract]
   string MyOp1(int myint);
   [OperationContract]
   string MyOp2(int myint);
}
public class MyService : IMyService {
   // This service needs to be constructed providing at least a string or an integer, if an attempt to construct it wothout passing any of these is done, the service should raise an error.
   MyService(string strparam) { ... }
   MyService(int intparam) { ... }
   MyService(string strparam, int intparam) { ... }
   public string MyOp1(int myint) { ... }
   public string MyOp2(int myint) { ... }
}
public class MyStandaloneService : IMyService {
   // This service does not need to be constructed.
   MyStandaloneService() { ... }
   public string MyOp1(int myint) { ... }
   public string MyOp2(int myint) { ... }
}
Run Code Online (Sandbox Code Playgroud)

1)案例1:可以使用ServiceHost该类的重载来托管服务:

public ServiceHost(
   Type serviceType,
   params Uri[] baseAddresses
)
Run Code Online (Sandbox Code Playgroud)

通过使用它,可以让框架管理服务实例化,因为只需要服务类型.当然,如果服务,建筑是基础建设.将调用no参数构造函数.处理不需要特殊构造的服务时,这种过载很好...某种独立服务:

using (ServiceHost host = new ServiceHost(typeof(MyStandaloneService))) {
   host.Open();
   ...
   host.Close();
}
Run Code Online (Sandbox Code Playgroud)

2)案例2:可以使用ServiceHost该类的重载来托管服务:

public ServiceHost(
   Object singletonInstance,
   params Uri[] baseAddresses
)
Run Code Online (Sandbox Code Playgroud)

通过使用它,可以实例化一个服务然后托管它而不让框架处理这个...这种方法在处理需要特殊处理并且不是完全独立的服务时很好:

MyService MS = new MyService("the string");
using (ServiceHost host = new ServiceHost(MS)) {
   host.Open();
   ...
   host.Close();
}
Run Code Online (Sandbox Code Playgroud)

好吧,我想了解以下内容:

A)在案例1中,可以通过提供类型自动托管服务.如果我尝试创建相同类型的另一个服务(MyStandaloneService),它是否会导致错误,因为尝试创建两个相同的服务?在这种情况下,我应该硬编码端点配置,因为使用配置文件将导致在同一地址中托管两个相同的服务.

B)在案例2中,MSDN文档说这创建了服务的单例实例.所以如果我试图以这种方式托管另一个服务:

MyService MS = new MyService("the string");
MyService MS2 = new MyService(23);
ServiceHost host = new ServiceHost(MS));
ServiceHost host2 = new ServiceHost(MS2));
host.Open();
host2.Open();
...
host.Close();
host2.Close();
Run Code Online (Sandbox Code Playgroud)

我会收到错误吗?

C)如果我想避免单例实例化,我该怎么办?

谢谢

Zru*_*uty 8

首先,您可能需要查看ServiceBehaviorAttribute MSDN文章.

我不在这里详细介绍,但您可以创建服务对象的一个​​实例来处理所有请求(按顺序,也就是一个接一个),或者让ServiceHost对象为每个请求创建一个服务对象并同时处理它们在不同的线程.

一旦确定了哪种方法最适合您的应用程序,您将了解ServiceHost要使用哪一个构造函数重载.您的CASE 1对应于多实例同时处理方法,而CASE 2对应于"一个实例来处理它们"的方法.

ServiceHost重载必须用手手[ServiceBehavior]在你的属性MyService的类.所以,请查看我上面给出的链接.

编辑:现在回答你的问题:

A)如果我尝试创建相同类型的另一个服务(MyStandaloneService),是否会因为尝试创建两个相同的服务而导致错误?

不,它将通过ServiceHost以下方式完成:它将为每个请求创建一个服务实例(事实上,每个会话,但再次读取MSDN)

B)在案例2中,MSDN文档说这创建了服务的单例实例.所以如果我试图以这种方式托管另一个服务(...)我会收到错误吗?

您不能同时使用相同的ABC托管两个服务,所以是的.如果您将它们托管在不同的端点上,那就没问题.这里的"单"是指一个单一的服务实例会处理所有的请求.

C)如果我想避免单例实例化,我该怎么办?

使用CASE 1方法:)