Noções básicas de código de cliente gerado
A Ferramenta de utilitário de metadados ServiceModel (Svcutil.exe) gera código cliente e um arquivo de configuração de aplicativo cliente para uso na criação de aplicativos cliente. Este tópico fornece um tour de exemplos de código gerados para cenários de contrato de serviço padrão. Para obter mais informações sobre como criar um aplicativo cliente usando o código gerado, consulte Visão geral do cliente WCF.
Visão geral
Se você usar o Visual Studio para gerar tipos de cliente do Windows Communication Foundation (WCF) para seu projeto, normalmente não precisará examinar o código de cliente gerado. Se você não estiver usando um ambiente de desenvolvimento que execute os mesmos serviços para você, poderá usar uma ferramenta como Svcutil.exe para gerar o código do cliente e usar esse código para desenvolver seu aplicativo cliente.
Como o Svcutil.exe tem várias opções que modificam as informações de tipo gerado, este tópico não aborda todos os cenários. No entanto, as seguintes tarefas padrão envolvem localizar o código gerado:
Identificando interfaces de contrato de serviço.
Identificando a classe do cliente WCF.
Identificando tipos de dados.
Identificando contratos de retorno de chamada para serviços duplex.
Identificando a interface do canal do contrato de serviço auxiliar.
Localizando interfaces de contrato de serviço
Para localizar as interfaces que modelam os contratos de serviço, procure as interfaces marcadas com o atributo System.ServiceModel.ServiceContractAttribute. Muitas vezes, esse atributo pode ser difícil de localizar com uma leitura rápida devido à presença de outros atributos e às propriedades explícitas definidas no próprio atributo. Lembre-se de que a interface do contrato de serviço e a interface do contrato do cliente são dois tipos diferentes. O exemplo de código a seguir mostra o contrato de serviço original.
[ServiceContractAttribute(
Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
[OperationContractAttribute]
[FaultContractAttribute(typeof(microsoft.wcf.documentation.SampleFault))]
string SampleMethod(string msg);
}
O exemplo de código a seguir mostra o mesmo contrato de serviço gerado por Svcutil.exe.
[System.ServiceModel.ServiceContractAttribute(
Namespace = "http://microsoft.wcf.documentation"
)]
public interface ISampleService
{
[System.ServiceModel.OperationContractAttribute(
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
)]
[System.ServiceModel.FaultContractAttribute(
typeof(microsoft.wcf.documentation.SampleFault),
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
)]
string SampleMethod(string msg);
}
Você pode usar a interface de contrato de serviço gerada junto com a classe System.ServiceModel.ChannelFactory para criar um objeto de canal WCF com o qual invocar operações de serviço. Para obter mais informações, consulte Como: usar o ChannelFactory.
Encontrando classes de cliente WCF
Para localizar a classe de cliente WCF que implementa o contrato de serviço que você deseja usar, procure uma extensão de System.ServiceModel.ClientBase<TChannel>, em que o parâmetro de tipo é a interface do contrato de serviço que você localizou anteriormente e que estende essa interface. O exemplo de código a seguir mostra a classe ClientBase<TChannel> do tipo ISampleService
.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class SampleServiceClient : System.ServiceModel.ClientBase<ISampleService>, ISampleService
{
public SampleServiceClient()
{
}
public SampleServiceClient(string endpointConfigurationName)
:
base(endpointConfigurationName)
{
}
public SampleServiceClient(string endpointConfigurationName, string remoteAddress)
:
base(endpointConfigurationName, remoteAddress)
{
}
public SampleServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress)
:
base(endpointConfigurationName, remoteAddress)
{
}
public SampleServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress)
:
base(binding, remoteAddress)
{
}
public string SampleMethod(string msg)
{
return base.Channel.SampleMethod(msg);
}
}
Você pode usar essa classe de cliente WCF criando uma nova instância dela e chamando os métodos que ela implementa. Esses métodos invocam a operação de serviço com a qual foi projetado e configurado para interagir. Para obter mais informações, consulte Visão geral do cliente WCF.
Observação
Quando SvcUtil.exe gera uma classe de cliente WCF, ele adiciona um DebuggerStepThroughAttribute à classe de cliente que impede que os depuradores percorram a classe de cliente WCF.
Encontrando tipos de dados
Para localizar tipos de dados no código gerado, o mecanismo mais básico é identificar o nome do tipo especificado em um contrato e pesquisar o código para essa declaração de tipo. Por exemplo, o contrato a seguir especifica que o SampleMethod
pode retornar uma falha SOAP do tipo microsoft.wcf.documentation.SampleFault
.
[System.ServiceModel.OperationContractAttribute(
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethod",
ReplyAction = "http://microsoft.wcf.documentation/ISampleService/SampleMethodResponse"
)]
[System.ServiceModel.FaultContractAttribute(
typeof(microsoft.wcf.documentation.SampleFault),
Action = "http://microsoft.wcf.documentation/ISampleService/SampleMethodSampleFaultFault"
)]
string SampleMethod(string msg);
A pesquisa por SampleFault
localiza a seguinte declaração de tipo.
[assembly: System.Runtime.Serialization.ContractNamespaceAttribute(
"http://microsoft.wcf.documentation",
ClrNamespace = "microsoft.wcf.documentation"
)]
namespace microsoft.wcf.documentation
{
using System.Runtime.Serialization;
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute()]
public partial class SampleFault : object, System.Runtime.Serialization.IExtensibleDataObject
{
private System.Runtime.Serialization.ExtensionDataObject extensionDataField;
private string FaultMessageField;
public System.Runtime.Serialization.ExtensionDataObject ExtensionData
{
get
{
return this.extensionDataField;
}
set
{
this.extensionDataField = value;
}
}
[System.Runtime.Serialization.DataMemberAttribute()]
public string FaultMessage
{
get
{
return this.FaultMessageField;
}
set
{
this.FaultMessageField = value;
}
}
}
}
Nesse caso, o tipo de dados é o tipo de detalhe gerado por uma exceção específica no cliente, um FaultException<TDetail> em que o parâmetro do tipo de detalhe é microsoft.wcf.documentation.SampleFault
. Para obter mais informações sobre tipos de dados, consulte Especificando a transferência de dados em contratos de serviço. Para obter mais informações sobre como lidar com exceções em clientes, consulte Envio e recebimento de falhas.
Encontrando contratos de retorno de chamada para serviços duplex
Se você localizar um contrato de serviço para o qual a interface do contrato especifica um valor para a propriedade ServiceContractAttribute.CallbackContract, esse contrato especifica um contrato duplex. Os contratos duplex exigem que o aplicativo cliente crie uma classe de retorno de chamada que implemente o contrato de retorno de chamada e passe uma instância dessa classe para o System.ServiceModel.DuplexClientBase<TChannel> ou System.ServiceModel.DuplexChannelFactory<TChannel> usado para se comunicar com o serviço. Para obter mais informações sobre clientes duplex, consulte Como: acessar serviços com um contrato duplex.
O contrato a seguir especifica um contrato de retorno de chamada do tipo SampleDuplexHelloCallback
.
[System.ServiceModel.ServiceContractAttribute(
Namespace="http://microsoft.wcf.documentation",
ConfigurationName="SampleDuplexHello",
CallbackContract=typeof(SampleDuplexHelloCallback),
SessionMode=System.ServiceModel.SessionMode.Required
)]
public interface SampleDuplexHello
{
[System.ServiceModel.OperationContractAttribute(
IsOneWay=true,
Action="http://microsoft.wcf.documentation/SampleDuplexHello/Hello"
)]
void Hello(string greeting);
}
<System.ServiceModel.OperationContractAttribute(IsOneWay:=True, _
Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Hello")> _
Sub Hello(ByVal greeting As String)
End Interface 'SampleDuplexHello
A pesquisa desse contrato de retorno de chamada localiza a interface a seguir que o aplicativo cliente deve implementar.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface SampleDuplexHelloCallback
{
[System.ServiceModel.OperationContractAttribute(
IsOneWay=true,
Action="http://microsoft.wcf.documentation/SampleDuplexHello/Reply"
)]
void Reply(string responseToGreeting);
}
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")> _
Public Interface SampleDuplexHelloCallback
<System.ServiceModel.OperationContractAttribute( _
IsOneWay:=True, _
Action:="http://microsoft.wcf.documentation/SampleDuplexHello/Reply")> _
Sub Reply(ByVal responseToGreeting As String)
End Interface 'SampleDuplexHelloCallback
Encontrando interfaces de canal de contrato de serviço
Ao usar a classe ChannelFactory com uma interface de contrato de serviço, você deve converter para a interface System.ServiceModel.IClientChannel para abrir, fechar ou anular explicitamente o canal. Para facilitar o trabalho, a ferramenta Svcutil.exe também gera uma interface auxiliar que implementa a interface do contrato de serviço e IClientChannel para permitir que você interaja com a infraestrutura do canal do cliente sem ter que converter. O código a seguir mostra a definição de um canal de cliente auxiliar que implementa o contrato de serviço anterior.
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ISampleServiceChannel : ISampleService, System.ServiceModel.IClientChannel
{
}