Configurando serviços usando arquivos de configuração
Configurar um serviço WCF (Windows Communication Foundation) com um arquivo de configuração oferece a flexibilidade de fornecer dados de comportamento de ponto de extremidade e serviço no ponto de implantação, em vez de em tempo de design. Este tópico descreve as principais técnicas disponíveis.
Um serviço WCF é configurável usando a tecnologia de configuração do .NET Framework. Mais comumente, elementos XML são adicionados ao arquivo Web.config para um site do IIS (Serviços de Informações da Internet) que hospeda um serviço WCF. Os elementos permitem alterar detalhes como os endereços de ponto de extremidade (os endereços reais usados para se comunicar com o serviço) máquina a máquina. Além disso, o WCF inclui vários elementos fornecidos pelo sistema que permitem selecionar rapidamente os recursos mais básicos para um serviço. A partir do .NET Framework 4, o WCF vem com um novo modelo de configuração padrão que simplifica os requisitos de configuração do WCF. Se você não fornecer nenhuma configuração WCF para um serviço específico, o tempo de execução configurará automaticamente seu serviço com alguns pontos de extremidade padrão e ligação/comportamento padrão. Na prática, escrever configuração é uma parte importante da programação de aplicativos WCF.
Para obter mais informações, consulte Configurando ligações para serviços. Para obter uma lista dos elementos mais comumente usados, consulte Ligações fornecidas pelo sistema. Para obter mais informações sobre pontos de extremidade padrão, associações e comportamentos, consulte Configuração simplificada e configuração simplificada para serviços WCF.
Importante
Ao implantar cenários lado a lado em que duas versões diferentes de um serviço são implantadas, é necessário especificar nomes parciais de assemblies referenciados em arquivos de configuração. Isso ocorre porque o arquivo de configuração é compartilhado entre todas as versões de um serviço e eles podem estar sendo executados em diferentes versões do .NET Framework.
System.Configuration: Web.config e App.config
WCF usa o sistema de configuração System.Configuration do .NET Framework.
Ao configurar um serviço no Visual Studio, use um arquivo Web.config ou um arquivo App.config para especificar as configurações. A escolha do nome do arquivo de configuração é determinada pelo ambiente de hospedagem escolhido para o serviço. Se você estiver usando o IIS para hospedar seu serviço, use um arquivo Web.config. Se você estiver usando qualquer outro ambiente de hospedagem, use um arquivo App.config.
No Visual Studio, o arquivo chamado App.config é usado para criar o arquivo de configuração final. O nome final realmente usado para a configuração depende do nome do assembly. Por exemplo, um assembly chamado "Cohowinery.exe" tem um nome de arquivo de configuração final de "Cohowinery.exe.config". No entanto, você só precisa modificar o arquivo App.config. As alterações feitas nesse arquivo são feitas automaticamente no arquivo de configuração final do aplicativo em tempo de compilação.
Ao usar um App.config, o arquivo do sistema de configuração mescla o arquivo App.config com o conteúdo do arquivo Machine.config quando o aplicativo é iniciado e a configuração é aplicada. Esse mecanismo permite que as configurações de toda a máquina sejam definidas no arquivo Machine.config. O arquivo App.config pode ser usado para substituir as configurações do arquivo Machine.config; você também pode bloquear as configurações no arquivo Machine.config para que elas sejam usadas. No caso Web.config, o sistema de configuração mescla os arquivos Web.config em todos os diretórios que levam ao diretório do aplicativo na configuração que é aplicada. Para obter mais informações sobre a configuração e a definição de prioridades, consulte os System.Configuration tópicos no namespace.
Principais seções do arquivo de configuração
As seções principais no arquivo de configuração incluem os seguintes elementos.
<system.ServiceModel>
<services>
<!-- Define the service endpoints. This section is optional in the new
default configuration model in .NET Framework 4. -->
<service>
<endpoint/>
</service>
</services>
<bindings>
<!-- Specify one or more of the system-provided binding elements,
for example, <basicHttpBinding> -->
<!-- Alternatively, <customBinding> elements. -->
<binding>
<!-- For example, a <BasicHttpBinding> element. -->
</binding>
</bindings>
<behaviors>
<!-- One or more of the system-provided or custom behavior elements. -->
<behavior>
<!-- For example, a <throttling> element. -->
</behavior>
</behaviors>
</system.ServiceModel>
Nota
As seções de ligações e comportamentos são opcionais e só são incluídas se necessário.
O <elemento de serviços>
O services
elemento contém as especificações para todos os serviços que o aplicativo hospeda. Começando com o modelo de configuração simplificado no .NET Framework 4, esta seção é opcional.
<services> (serviços)
O <elemento de serviço>
Cada serviço tem estes atributos:
name
. Especifica o tipo que fornece uma implementação de um contrato de serviço. Este é um nome totalmente qualificado que consiste no namespace, um ponto e, em seguida, o nome do tipo. Por exemplo,"MyNameSpace.myServiceType"
.behaviorConfiguration
. Especifica o nome de um dosbehavior
elementos encontrados nobehaviors
elemento . O comportamento especificado rege ações como se o serviço permite a representação. Se seu valor for o nome vazio ou nãobehaviorConfiguration
for fornecido, o conjunto padrão de comportamentos de serviço será adicionado ao serviço.
O <elemento de ponto de extremidade>
Cada ponto de extremidade requer um endereço, uma associação e um contrato, que são representados pelos seguintes atributos:
address
. Especifica o URI (Uniform Resource Identifier) do serviço, que pode ser um endereço absoluto ou um endereço fornecido em relação ao endereço base do serviço. Se definido como uma cadeia de caracteres vazia, indica que o ponto de extremidade está disponível no endereço base especificado ao criar o ServiceHost para o serviço.binding
. Normalmente, especifica uma associação fornecida pelo sistema, como WSHttpBinding, mas também pode especificar uma associação definida pelo usuário. A associação especificada determina o tipo de transporte, segurança e codificação usados, e se sessões, transações ou streaming confiáveis são suportados ou habilitados.bindingConfiguration
. Se os valores padrão de uma associação precisarem ser modificados, isso poderá ser feito configurando o elemento apropriadobinding
nobindings
elemento . Esse atributo deve receber o mesmo valor que oname
atributo dobinding
elemento que é usado para alterar os padrões. Se nenhum nome for fornecido, ou nenhumbindingConfiguration
for especificado na ligação, a associação padrão do tipo de associação será usada no ponto de extremidade.contract
. Especifica a interface que define o contrato. Esta é a interface implementada no tipo CLR (Common Language Runtime) especificado peloname
atributo doservice
elemento .
O <elemento bindings>
O bindings
elemento contém as especificações para todas as associações que podem ser usadas por qualquer ponto de extremidade definido em qualquer serviço.
O <elemento de ligação>
Os binding
elementos contidos no bindings
elemento podem ser uma das ligações fornecidas pelo sistema (consulte Ligações fornecidas pelo sistema) ou uma ligação personalizada (consulte Ligações personalizadas). O binding
elemento tem um name
atributo que correlaciona a ligação com o ponto de extremidade especificado no bindingConfiguration
atributo do endpoint
elemento . Se nenhum nome for especificado, essa associação corresponderá ao padrão desse tipo de associação.
Para obter mais informações sobre como configurar serviços e clientes, consulte Configurando serviços WCF.
O <elemento de comportamentos>
Este é um elemento de contêiner para os behavior
elementos que definem os comportamentos de um serviço.
O <elemento de comportamento>
Cada behavior
elemento é identificado por um name
atributo e fornece um comportamento fornecido pelo sistema, como <throttling>
, ou um comportamento personalizado. Se nenhum nome for fornecido, esse elemento de comportamento corresponderá ao serviço padrão ou ao comportamento do ponto de extremidade.
Como usar configurações de vinculação e comportamento
O WCF facilita o compartilhamento de configurações entre pontos de extremidade usando um sistema de referência na configuração. Em vez de atribuir diretamente valores de configuração a um ponto de extremidade, os valores de configuração relacionados à associação são agrupados em bindingConfiguration
elementos na <binding>
seção . Uma configuração de associação é um grupo nomeado de configurações em uma associação. Os pontos de extremidade podem então fazer referência ao bindingConfiguration
nome by.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="myBindingConfiguration1" closeTimeout="00:01:00" />
<binding name="myBindingConfiguration2" closeTimeout="00:02:00" />
<binding closeTimeout="00:03:00" /> <!-- Default binding for basicHttpBinding -->
</basicHttpBinding>
</bindings>
<services>
<service name="MyNamespace.myServiceType">
<endpoint
address="myAddress" binding="basicHttpBinding"
bindingConfiguration="myBindingConfiguration1"
contract="MyContract" />
<endpoint
address="myAddress2" binding="basicHttpBinding"
bindingConfiguration="myBindingConfiguration2"
contract="MyContract" />
<endpoint
address="myAddress3" binding="basicHttpBinding"
contract="MyContract" />
</service>
</services>
</system.serviceModel>
</configuration>
O name
de bindingConfiguration
é definido no <binding>
elemento . O name
deve ser uma cadeia de caracteres exclusiva dentro do escopo do tipo de vinculação — neste caso, o <basicHttpBinding>, ou um valor vazio para se referir à associação padrão. O ponto de extremidade vincula-se à configuração definindo o bindingConfiguration
atributo para essa cadeia de caracteres.
A behaviorConfiguration
é implementado da mesma forma, como ilustrado no exemplo a seguir.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="myBehavior">
<callbackDebug includeExceptionDetailInFaults="true" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service name="NewServiceType">
<endpoint
address="myAddress3" behaviorConfiguration="myBehavior"
binding="basicHttpBinding"
contract="MyContract" />
</service>
</services>
</system.serviceModel>
</configuration>
Observe que o conjunto padrão de comportamentos de serviço é adicionado ao serviço. Este sistema permite que os pontos finais partilhem configurações comuns sem redefinir as definições. Se o escopo de toda a máquina for necessário, crie a configuração de associação ou comportamento em Machine.config. As definições de configuração estão disponíveis em todos os arquivos App.config. A Ferramenta Editor de Configuração (SvcConfigEditor.exe) facilita a criação de configurações.
Mesclagem de comportamento
O recurso de mesclagem de comportamento facilita o gerenciamento de comportamentos quando você deseja que um conjunto de comportamentos comuns seja usado de forma consistente. Esse recurso permite especificar comportamentos em diferentes níveis da hierarquia de configuração e fazer com que os serviços herdem comportamentos de vários níveis da hierarquia de configuração. Para ilustrar como isso funciona, suponha que você tenha o seguinte layout de diretório virtual no IIS:
~\Web.config~\Service.svc~\Child\Web.config~\Child\Service.svc
E o seu ~\Web.config
ficheiro tem o seguinte conteúdo:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceDebug includeExceptionDetailInFaults="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
E você tem um filho Web.config localizado em ~\Child\Web.config com o seguinte conteúdo:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
O serviço localizado em ~\Child\Service.svc se comportará como se tivesse os comportamentos serviceDebug e serviceMetadata. O serviço localizado em ~\Service.svc terá apenas o comportamento serviceDebug. O que acontece é que as duas coleções de comportamento com o mesmo nome (neste caso, a cadeia de caracteres vazia) são mescladas.
Você também pode limpar coleções de comportamento usando a <tag clear> e remover comportamentos individuais da coleção usando a <tag remover> . Por exemplo, as duas configurações a seguir resultam em que o serviço filho tenha apenas o comportamento serviceMetadata:
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<remove name="serviceDebug"/>
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<clear/>
<serviceMetadata httpGetEnabled="True" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
A mesclagem de comportamento é feita para coleções de comportamento sem nome, como mostrado acima, e coleções de comportamento nomeadas também.
A mesclagem de comportamento funciona no ambiente de hospedagem do IIS, no qual os arquivos Web.config são mesclados hierarquicamente com o arquivo Web.config raiz e machine.config. Mas também funciona no ambiente do aplicativo, onde machine.config pode mesclar com o arquivo App.config.
A mesclagem de comportamento aplica-se a comportamentos de ponto de extremidade e comportamentos de serviço na configuração.
Se uma coleção de comportamentos filho contiver um comportamento que já está presente na coleção de comportamentos pai, o comportamento filho substituirá o pai. Portanto, se uma coleção de comportamento pai tivesse <serviceMetadata httpGetEnabled="False" />
e uma coleção de comportamento filho tivesse <serviceMetadata httpGetEnabled="True" />
, o comportamento filho substituiria o comportamento pai na coleção de comportamentos e httpGetEnabled seria "true".