Como: melhorar o tempo de inicialização dos aplicativos do cliente WCF usando o XmlSerializer

Os aplicativos de serviços e de cliente que usam tipos de dados serializados usando o XmlSerializer geram e compilam o código de serialização para esses tipos de dados em tempo de execução, o que pode resultar em um desempenho lento da inicialização.

Observação

O código de serialização pré-gerado somente pode ser usado em aplicativos cliente e não em serviços.

A Ferramenta do Utilitário de Metadados ServiceModel (Svcutil.exe) pode melhorar o desempenho da inicialização desses aplicativos, gerando o código de serialização necessário dos assemblies compilados do aplicativo. O Svcutil.exe gera código de serialização para todos os tipos de dados usados em contratos de serviço no assembly de aplicativo compilado que podem ser serializados usando o XmlSerializer. Os contratos de serviço e operação que usam o XmlSerializer são marcados com o XmlSerializerFormatAttribute.

Para gerar código de serialização do XmlSerializer

  1. Compile seu serviço ou código do cliente em um ou mais assemblies.

  2. Abra um prompt de comando do SDK.

  3. No prompt de comando, inicie a ferramenta Svcutil.exe usando o seguinte formato.

    svcutil.exe /t:xmlSerializer  <assemblyPath>*  
    

    O argumento assemblyPath especifica o caminho para um assembly que contém tipos de contrato de serviço. O Svcutil.exe gera código de serialização para todos os tipos de dados usados em contratos de serviço no assembly de aplicativo compilado que podem ser serializados usando o XmlSerializer.

    O Svcutil.exe só pode gerar código de serialização no C#. Um arquivo de código-fonte é gerado para cada assembly de entrada. Você não pode usar a opção /language para alterar a linguagem do código gerado.

    Para especificar o caminho para assemblies dependentes, use a opção /reference.

  4. Disponibilize o código de serialização gerado para seu aplicativo usando uma das seguintes opções:

    1. Compile o código de serialização gerado em um assembly separado com o nome [assembly original].XmlSerializers.dll (por exemplo, MyApp.XmlSerializers.dll). Seu aplicativo deve ser capaz de carregar o assembly, que deve ser assinado com a mesma chave que o assembly original. Se recompilar o assembly original, você deverá regenerar o assembly de serialização.

    2. Compile o código de serialização gerado em um assembly separado e use o XmlSerializerAssemblyAttribute no contrato de serviço que usa o XmlSerializerFormatAttribute. Defina as propriedades AssemblyName ou CodeBase para apontar para o assembly de serialização compilado.

    3. Compile o código de serialização gerado no assembly do aplicativo e adicione o XmlSerializerAssemblyAttribute ao contrato de serviço que usa o XmlSerializerFormatAttribute. Não defina as propriedades AssemblyName ou CodeBase. O assembly de serialização padrão é considerado o assembly atual.

Para gerar código de serialização do XmlSerializer no Visual Studio

  1. Crie o serviço WCF e projetos de cliente no Visual Studio. Em seguida, adicione uma referência de serviço ao projeto do cliente.

  2. Adicione um XmlSerializerFormatAttribute ao contrato de serviço no arquivo reference.cs no projeto do aplicativo cliente em serviceReference ->reference.svcmap. Observe que você precisa mostrar todos os arquivos no Gerenciador de Soluções para ver esses arquivos.

  3. Compile um aplicativo cliente.

  4. Use a Ferramenta do utilitário de metadados do ServiceModel (Svcutil.exe) para criar um arquivo .cs do serializador pré-gerado usando o comando:

    svcutil.exe /t:xmlSerializer  <assemblyPath>*  
    

    O argumento assemblyPath especifica o caminho para o assembly cliente do WCF.

    Como:

    svcutil.exe /t:xmlSerializer wcfclient.exe  
    

    O arquivo WCFClient.XmlSerializers.dll.cs será gerado.

  5. Compile o assembly de serialização pré-gerado.

    Com base no exemplo na etapa anterior, o comando compilar seria o seguinte:

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

    Verifique se o WCFClient.XmlSerializers.dll gerado está no mesmo diretório que o aplicativo cliente, que é WCFClient.exe nesse caso.

  6. Execute o aplicativo cliente como de costume. O assembly de serialização pré-gerado será usado.

Exemplo

O comando a seguir gera tipos de serialização para os tipos XmlSerializer que todos os contratos de serviço no assembly usam.

svcutil /t:xmlserializer myContractLibrary.exe  

Confira também