如何:使用 XmlSerializer 改进 WCF 客户端应用程序的启动时间

使用可序列化数据类型的服务和客户端应用程序在运行时生成和编译这些数据类型的序列化代码,这可能会导致启动性能缓慢。

注释

预生成的序列化代码只能在客户端应用程序中使用,不能在服务中使用。

ServiceModel 元数据实用工具工具(Svcutil.exe)可以通过从应用程序的已编译程序集生成必要的序列化代码来提高这些应用程序的启动性能。 Svcutil.exe 为编译的应用程序程序集中的服务协定所使用的所有数据类型生成序列化代码,这些数据类型可以使用XmlSerializer序列化。 使用 XmlSerializer 的服务和操作合同标有 XmlSerializerFormatAttribute

生成 XmlSerializer 序列化代码

  1. 将服务或客户端代码编译为一个或多个程序集。

  2. 打开 SDK 命令提示符。

  3. 在命令提示符处,使用以下格式启动 Svcutil.exe 工具。

    svcutil.exe /t:xmlSerializer  <assemblyPath>*
    

    assemblyPath 参数指定包含服务协定类型的程序集的路径。 Svcutil.exe 为编译的应用程序程序集中的服务协定中使用的所有数据类型生成可以用XmlSerializer序列化的序列化代码。

    Svcutil.exe 只能生成 C# 序列化代码。 为每个输入程序集生成一个源代码文件。 不能使用 /language 开关更改生成的代码的语言。

    若要指定依赖程序集的路径,请使用 /reference 选项。

  4. 使用以下选项之一使生成的序列化代码可供应用程序使用:

    1. 将生成的序列化代码编译为名为 [原始程序集] 的单独程序集.XmlSerializers.dll(例如,MyApp.XmlSerializers.dll)。 应用程序必须能够加载程序集,该程序集必须使用与原始程序集相同的密钥进行签名。 如果重新编译原始程序集,则必须重新生成序列化程序集。

    2. 将生成的序列化代码编译为单独的程序集,并在使用XmlSerializerFormatAttribute的服务协定中使用XmlSerializerAssemblyAttribute。 设置 AssemblyNameCodeBase 属性以指向已编译的序列化程序集。

    3. 将生成的序列化代码编译到应用程序程序集中,并将 XmlSerializerAssemblyAttribute 添加到使用 XmlSerializerFormatAttribute 的服务协定中。 请勿设置 AssemblyNameCodeBase 属性。 默认序列化程序集假定为当前程序集。

在 Visual Studio 中生成 XmlSerializer 序列化代码

  1. 在 Visual Studio 中创建 WCF 服务和客户端项目。 然后,向客户端项目添加服务引用。

  2. 在客户端应用项目的serviceReference ->reference.svcmap下的reference.cs文件中添加XmlSerializerFormatAttribute。 请注意,需要在 解决方案资源管理器 中显示所有文件才能查看这些文件。

  3. 生成客户端应用。

  4. 使用 ServiceModel 元数据实用工具工具(Svcutil.exe) 通过命令创建预生成的序列化程序 .cs 文件:

    svcutil.exe /t:xmlSerializer  <assemblyPath>*
    

    assemblyPath 参数指定 WCF 客户端程序集的路径。

    比如说:

    svcutil.exe /t:xmlSerializer wcfclient.exe
    

    将生成 WCFClient.XmlSerializers.dll.cs 文件。

  5. 编译预生成的序列化程序集。

    根据上一步中的示例,编译命令如下:

    csc /r:wcfclient.exe /out:WCFClient.XmlSerializers.dll /t:library WCFClient.XmlSerializers.dll.cs
    

    确保生成的 WCFClient.XmlSerializers.dll 与客户端应用位于同一目录中,在本例中 WCFClient.exe

  6. 照常运行客户端应用。 将使用预生成的序列化程序集。

Example

以下命令为程序集中的任何服务协定使用的 XmlSerializer 类型生成序列化类型。

svcutil /t:xmlserializer myContractLibrary.exe

另请参阅