服务主机
服务主机是用于在进程中托管服务的运行时环境。
服务可以在服务主机内配置一个或多个终结点。
创建服务主机
在创建服务主机之前,服务需要定义其终结点。 服务主机中的终结点在 WS_SERVICE_ENDPOINT 结构中指定,并由以下信息定义:
- 地址,即服务将托管的物理 URI。
- 一个 WS_CHANNEL_TYPE 结构,指定终结点的基础通道的类型。
- 指定通道绑定的 WS_CHANNEL_BINDING 结构。
- 包含终结点安全说明的 WS_SECURITY_DESCRIPTION 结构。
- 表示终结点 服务协定 的 WS_SERVICE_CONTRACT 结构。
- 指定终结点的授权回调函数的 WS_SERVICE_SECURITY_CALLBACK 结构。
- 包含服务终结点属性数组的 WS_SERVICE_ENDPOINT_PROPERTY 结构。
WS_SERVICE_ENDPOINT serviceEndpoint = {0};
const WS_SERVICE_ENDPOINT* serviceEndpoints[1];
serviceEndpoints[0] = &serviceEndpoint;
WS_STRING url = WS_STRING_VALUE(L"net.tcp://+/Example");
// Method based service contract for the service
static WS_SERVICE_CONTRACT calculatorContract =
{
&calculatorContractDescription, // comes from a generated header.
NULL,
&calculatorFunctions, // specified by the application
};
serviceEndpoint.address.url = &url;
serviceEndpoint.binding.channelBinding = WS_TCP_CHANNEL_BINDING;
serviceEndpoint.contract = &calculatorContract;
serviceEndpoint.channelType = WS_CHANNEL_TYPE_DUPLEX_SESSION;
serviceEndpoint.authorizationCallback = AuthorizationCallback; // Authorization callback.
WS_CHANNEL_BINDING 枚举中的 WS_UDP_CHANNEL_BINDING 表示,基于 UDP 的 SOAP 仅支持单向协定。
定义终结点后,可以将它传递给 WsCreateServiceHost 函数,该函数采用指向 WS_SERVICE_ENDPOINT 结构的指针数组。
HRESULT hr = WsCreateServiceHost (serviceEndpoints, 1, NULL, 0, &host, error);
应用程序可以选择提供 服务属性数组,WsCreateServiceHost 来配置服务主机上的自定义设置。
应用程序打开服务主机以开始接受客户端请求。
WsOpenServiceHost(serviceHost, NULL, NULL);
打开服务主机后,如果没有任何需要它的作,应用程序可以关闭它。 请注意,这不会释放其资源,并且可以通过后续调用 WsResetServiceHost重新打开它。
WsCloseServiceHost(serviceHost, NULL, NULL);
关闭服务主机后,应用程序可以重置服务主机以供重复使用。
WsResetServiceHost(serviceHost, NULL);
使用服务主机完成应用程序后,可以通过调用 WsFreeServiceHost 函数释放与服务主机关联的资源。 请注意,在调用此函数之前,必须调用 WsCloseServiceHost。
WsFreeServiceHost(serviceHost, NULL);
有关将自定义状态附加到服务主机的信息,请参阅 用户主机状态
有关给定终结点的服务主机中的授权的信息,请参阅 服务授权。
有关实现服务服务作和服务协定的 iinformation,请参阅 服务作 和 服务协定主题。
安全
应用程序可以使用以下属性来控制服务主机代表应用程序分配的资源量:
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_ACCEPTING_CHANNELS,
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CONCURRENCY,
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CHANNELS,
- WS_SERVICE_ENDPOINT_PROPERTY_BODY_HEAP_MAX_SIZE,
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CALL_POOL_SIZE,
- WS_SERVICE_ENDPOINT_PROPERTY_MAX_CHANNEL_POOL_SIZE。
为每个属性选择安全默认值,如果应用程序希望修改这些属性,则必须小心。 除了上述属性之外,通道、侦听器 和 消息 特定属性也可以由应用程序修改。 在修改这些设置之前,请参阅这些组件的安全注意事项。
此外,在使用 WWSAPI 服务主机 API 时,应仔细评估以下应用程序设计注意事项:
- 使用 MEX 时,应用程序应小心不要披露任何敏感数据。 作为缓解措施,如果通过 MEX 公开的数据的性质是敏感的,应用程序可以选择使用至少需要身份验证的安全绑定来配置 MEX 终结点,并使用 WS_SERVICE_SECURITY_CALLBACK在终结点中实现授权。
- 默认情况下,WS_SERVICE_PROPERTY_FAULT_DISCLOSURE 属性在服务主机上禁用通过错误提供的丰富错误信息。 应用程序有权将丰富的错误信息作为错误的一部分发送。 但是,这可能会导致信息泄露,因此建议仅为调试方案更改此设置。
- 除了对基本配置文件 2.0 和 XML 序列化执行的验证之外,服务主机不会对作为服务作参数一部分接收的数据内容执行验证。 应用程序有责任自行执行所有参数验证。
- 授权未作为服务主机的一部分实现。 但是,应用程序可以使用 WS_SECURITY_DESCRIPTION 和 WS_SERVICE_SECURITY_CALLBACK实现自己的授权方案。
- 应用程序有责任在其终结点上使用安全绑定。 除了终结点上配置的内容之外,服务主机不提供任何安全性。
以下 API 元素与服务主机一起使用。
回调 | 描述 |
---|---|
WS_SERVICE_ACCEPT_CHANNEL_CALLBACK | 当服务主机在终结点侦听器上接受通道时调用。 |
WS_SERVICE_CLOSE_CHANNEL_CALLBACK | 在终结点上关闭或中止通道时调用。 |
列举 | 描述 |
---|---|
WS_SERVICE_ENDPOINT_PROPERTY_ID | 用于配置 WS_SERVICE_ENDPOINT的可选参数。 |
WS_SERVICE_HOST_STATE | 服务主机可以处于状态。 |
WS_SERVICE_PROPERTY_ID | 用于配置服务主机的可选参数。 |
功能 | 描述 |
---|---|
WsAbortServiceHost | 中断并停止对服务主机上的当前作。 |
WsCloseServiceHost | 关闭所有侦听器,以便不会接受来自客户端的新通道。 |
WsCreateServiceHost | 创建服务主机。 |
WsFreeServiceHost | 释放与服务主机对象关联的内存。 |
WsGetServiceHostProperty | 检索指定的服务主机属性。 |
WsOpenServiceHost | 打开服务主机进行通信,并在所有终结点上启动侦听器。 |
WsResetServiceHost | 重置服务主机以重复使用,并重置基础通道和侦听器以供重复使用。 |
处理 | 描述 |
---|---|
WS_SERVICE_HOST | 用于引用服务主机的不透明类型。 |
结构 | 描述 |
---|---|
WS_SERVICE_ENDPOINT | 表示服务主机上的单个终结点。 |
WS_SERVICE_ENDPOINT_PROPERTY | 指定特定于服务的设置。 |
WS_SERVICE_PROPERTY | 指定特定于服务的设置。 |
WS_SERVICE_PROPERTY_ACCEPT_CALLBACK | 指定成功接受通道时调用的回调。 |
WS_SERVICE_PROPERTY_CLOSE_CALLBACK | 指定在通道即将关闭时调用的回调。 |