如何:检索元数据并实现兼容服务。
通常,设计和实现服务并不是由同一个人完成的。在交互操作应用程序很重要的环境中,可以用 Web 服务描述语言 (WSDL) 设计或描述协定,而且开发人员必须实现一个与所提供的协定相兼容的服务。您可能还需要将现有服务迁移到 Windows Communication Foundation (WCF),但保留连网格式。此外,双工协定还需要调用方实现一个回调协定。
在这些情况下,必须使用ServiceModel 元数据实用工具 (Svcutil.exe)(或等效工具)通过可以实现的托管语言生成服务协定接口,以满足协定的要求。通常情况下,ServiceModel 元数据实用工具 (Svcutil.exe) 用于获取一个服务协定,该服务协定与通道工厂或 WCF 客户端类型以及设置正确的绑定和地址的客户端配置文件一起使用。若要使用生成的配置文件,则必须将其更改到服务配置文件中。您可能还需要修改服务协定。
检索数据并实现兼容服务
对元数据文件或元数据终结点使用ServiceModel 元数据实用工具 (Svcutil.exe) 以生成代码文件。
搜索输出代码文件中包含相关接口的部分(以防存在多个接口),此接口是用 System.ServiceModel.ServiceContractAttribute 属性标记的。下面的代码示例演示由ServiceModel 元数据实用工具 (Svcutil.exe) 生成的两个接口。第一个 (
ISampleService
) 是服务协定接口,实现它可创建兼容服务。第二个 (ISampleServiceChannel
) 是帮助器接口,客户端使用它可同时扩展服务协定接口和 System.ServiceModel.IClientChannel,且该接口可用于客户端应用程序。如果 WSDL 未指定所有操作的答复操作,则生成的操作协定可能会将 ReplyAction 属性设置为通配符 (*)。移除该属性设置。否则,当您实现服务协定元数据时,将不能为这些操作导出元数据。
实现类上的接口并承载服务。有关示例,请参见如何:实现 Windows Communication Foundation 服务协定,或参见下面“示例”部分中的简单实现。
在由ServiceModel 元数据实用工具 (Svcutil.exe) 生成的客户端配置文件中,将 <client> 配置部分更改为 <services> 配置部分。(有关生成的客户端应用程序配置文件的示例,请参见下面的“示例”部分。)
在 <services> 配置部分中,在服务实现的 <services> 配置部分创建 name 属性。
将服务的 name 属性设置为服务实现的配置名称。
将使用实现的服务协定的终结点配置元素添加到服务配置部分。
示例
下面的代码示例演示通过对元数据文件运行ServiceModel 元数据实用工具 (Svcutil.exe) 而生成的大部分代码文件。
下面的代码演示:
实现时符合协定要求的服务协定接口 (
ISampleService
)。客户端所使用的帮助器接口,可用于同时扩展服务协定接口和 System.ServiceModel.IClientChannel,并可用于客户端应用程序 (
ISampleServiceChannel
)。扩展 System.ServiceModel.ClientBase 的帮助器类,可用于客户端应用程序 (
SampleServiceClient
)。从服务生成的配置文件。
简单的
ISampleService
服务实现。客户端配置文件到服务器端版本的转换。
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://localhost:8080/SampleService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService" contract="ISampleService"
name="BasicHttpBinding_ISampleService" />
</client>
</system.serviceModel>
</configuration>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISampleService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service
name="Microsoft.WCF.Documentation.SampleService">
<endpoint address="https://localhost:8080/SampleService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ISampleService" contract="Microsoft.WCF.Documentation.ISampleService"
/>
</service>
</services>
</system.serviceModel>
</configuration>