Entendendo WCF ServiceHost .svc

  • Rafael Miceli
  • 6 Mai 2017

Etendendo um pouco melhor o arquivo *.svc

Falando mais um pouco de WCF, eu já tive muitas vezes dúvida sobre como funciona o arquivo *.svc e neste post espero resolver as dúvidas que já tive, pois são poucas fontes com explicação fácil (pelo menos para mim) para entender o papel dele no WCF.

Quando criamos um template da nossa aplicação WCF o *.svc ja vem de cara, mas ele não é obrigatório para que nossa aplicação WCF rode. Este arquivo é reconhecido apenas pelo IIS (que é muito provavelmente aonde você vai hospedar seu WCF) mas não é obrigatório. Ele serve para facilitar a inicialização do seu Endpoint.

Caso você pretenda fazer um SelfHost este arquivo não é necessário (mais de self host em outro post)

Quando criamos o *.svc de um template do AspNet ele vem com os seguintes atributos:

  • Language: Que especifica qual linguagem esse host vai compilar, geralmente vem preenchido C# ou VB
  • Debug: Indica se ao compilar o projeto ele vai gerar o *.pdb que é para debugar o código. Resumindo “Vou debugar ou não?”. Pode ser true ou false, e é case sensitive!
  • Service: Este atributo é um pouco mais complexo, podemos montar ele das seguintes maneiras:

    1 - Passamos o nome do Service que implemente uma Interface de ServiceContract, exemplo: Service="WcfService1.Service1"

    2 - Passamos o nome do Service que implemente uma Interface de ServiceContract e o namespace que se encontra este serviço, exemplo: Service="WcfService1.Service1, namespace.service"

    3 - Passamos o nome da Interface de ServiceContract e o namespace que se encontra esta interface, exemplo: Service="WcfService1.IService1, namespace.contract"

    Neste caso vamos precisar também que o factory esteja implementado

  • CodeBehind: Este atributo é opcional. Caso seu *.svc possua abaixo dele um arquivo do tipo *.svc.cs (ou *.svc.vb) você informa o nome da sua classe no *.svc.cs aqui (como já vem no template) caso você não tenha uma classe abaixo do *.svc então este atributo não é necessário.
  • Factory: Este atributo também é mais complexo, assim como no atributo Service nele passamos a classe Factory e seu namespace que vamos usar para instânciar o Service. No template de WCF ele não implementa este atributo. Quando este atributo não é implementado ele usa o Factory default que é o ServiceHostFactory

Formas de implementar o WCF com *.svc

1 - Com CodeBehind.

Para ver o *.svc com CodeBehind na forma padrão basta criar um project template do WCF que ele já cria com CodeBehind

2 - Sem CodeBehind e com Service namespace

O código de exemplo abaixo pode ser encontrado no repositório deste blog

AlunoServiceEndpoint.svc

<%@ ServiceHost 
Language="C#"
Debug="true"
Service="WcfApp.Services.AlunoService, WcfApp.Services"
%>

AlunoService.cs

namespace WcfApp.Services
{
    public class AlunoService: IAlunoServiceContract
    {
        public IEnumerable<string> BuscarNomesDosAlunos()
        {
            return new List<string> { "Aluno1", "Aluno2" };
        }
    }
}

IAlunoServiceContract.cs

namespace WcfApp.Contracts
{
    [ServiceContract]
    public interface IAlunoServiceContract
    {
        [OperationContract]
        IEnumerable<string> BuscarNomesDosAlunos();
    }
}

3 - Utilizando Factory

Para ver um exemplo utilizando Factory veja meu post anterior aonde faço Dependency Injection com AutoFac e com isso acabo utilizando o AutofacServiceHostFactory.

Fontes: https://msdn.microsoft.com/pt-br/library/aa967286(v=vs.110).aspx

comentarios com Disqus Disqus