Compartilhar via


Host um serviço WCF REST no IIS (pt-BR)

Esse artigo foi originalmente escrito em: http://social.technet.microsoft.com/wiki/contents/articles/1265.hosting-a-wcf-rest-service-on-iis-en-us.aspx 

Todos os exemplos de [[WCF]] REST utilizam os serviços auto-hospedado e muitas pessoas têm perguntado para obter um exemplo que está hospedado no IIS, então eu vou explicar como fazer isso aqui. Vamos começar com um contrato de serviço simples:

// IService.cs
namespace SimpleRESTService
{
    [ServiceContract]
    public interface IService
    {
        [Description("Simple echo operation over HTTP GET")]
        [WebGet]
        string EchoWithGet(string s);

        [Description("Simple echo operation over HTTP POST")]
        [WebInvoke]
        string EchoWithPost(string s);
    }

Em seguida, implemente o contrato IService: 

// service1.cs
namespace SimpleRESTService
{
    public class Service1 : IService
    {
        public string EchoWithGet(string s)
        {
            return "You said " + s;
        }

        public string EchoWithPost(string s)
        {
            return "You said " + s;
        }
    }
}

Adicione o arquivo Service1.svc:

 <%@ ServiceHost Language="C#" Debug="true" Service="SimpleRESTService.Service1" CodeBehind="Service1.svc.cs" %>

E por último adicione o arquivo web.config:

 <?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="SimpleRESTService.Service1"
                behaviorConfiguration="RESTBehavior">
        <endpoint address=""
                  binding="webHttpBinding"
                  contract="SimpleRESTService.IService"
                   behaviorConfiguration="MyEndpointBehavior"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="RESTBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="MyEndpointBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />                             
  </system.serviceModel>
</configuration>

A maneira mais fácil de executar este código é criar um novo aplicativo de serviço WCF no Visual Studio 2010 (ou anterior) e substituir os arquivos gerados com os arquivos listados aqui. Você pode pressionar CTRL + F5 e o ASP.NET Development Server hospedará o WCF app. Não confundida com o nome do ASP.NET Development Server que ele pode hospedar serviços WCF. Uma vez que o serviço está hospedado, em seguida, você pode usar IE para chamar a operação. Clique duas vezes sobre o ASP.NET Development Server ícone na barra de status (você pode ter de clicar na seta no lado inferior direito da barra de status para ver o ícone). Ele irá exibir a caixa de dialogo do ASP.NET Development Server  que irá conter o número da porta está sendo usado pelo servidor. Em seguida, abra o IE e digite a seguinte URL: http://localhost%3cport%3e/  onde <port> é substituído pelo número de porta encontrado no ASP.Diálogo NET Development Server. Você deve ver algo como o seguinte:

Agora, a URL usada não é muito bonita. Gostaríamos de não ter que especificar o arquivo. svc na URL. Bem, você está com sorte o recurso ASP.NET Routing Integration  permite você em fazer isso. Para usar o ASP.NET Routing Integration faça o seguinte:

1) Ative o ASP.NET compatibility. Isso é feito na tag <serviceHostingEnvironment> no arquivo web.config. Ele pode aparecer em qualquer lugar dentro do elemento <system.ServiceModel>. Aqui está um exemplo:

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>

2) Adicione o UrlRoutingModule e UrlRoutingHandler no seu arquivo web.config. Estes são colocados dentro de um elemento <system.webServer>, que aparece fora do elemento <system.serviceModel>. Aqui está um exemplo:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
   <add name="UrlRoutingModule"
        type="System.Web.Routing.UrlRoutingModule,
          System.Web.Routing, Version=4.0.0.0,
          Culture=neutral,
          PublicKeyToken=31BF3856AD364E35" />

  </modules>
  <handlers>
   <add name="UrlRoutingHandler"
      preCondition="integratedMode"
      verb="*" path="UrlRouting.axd"
      type="System.Web.HttpForbiddenHandler,
         System.Web, Version=4.0.0.0, Culture=neutral,
         PublicKeyToken=b03f5f7f11d50a3a" />
  </handlers>
 </system.webServer>

3) Adicione um arquivo global.asax no seu projeto clique com o botão direito no nome do projeto no solution explorer, selecione Adicionar Novo Item... e classe de aplicativo Global. No método Application_Start, adicione uma rota para a RouteTable que especifica um caminho relativo opcional, o WebServiceHostFactory e o tipo de serviço. Aqui está um exemplo:

protected void Application_Start(object sender, EventArgs e)
{
  RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(Service1)));
}

Agora você pode acessar seu serviço hospedado no ASP.NET Development Server usando esta URL:

 http://localhost%3cport%3e/

Então, agora temos o serviço hospedado sob o ASP.NET Development Server, podemos usar Visual Studio para publicar o serviço em um servidor IIS. No Visual Studio vá até o menu Build e selecione publicar SampleRESTService. Na caixa de diálogo onde você pode especificar onde e como publicar o serviço WCF:

Na caixa de diálogo acima podemos especificar que queremos que o serviço  hospedado no IIS sob http://localhost/SimpleRESTService

Verifique se o arquivo service1.svc não é um diretório virtual que foi criado depois que você clicar em publicar. Se foi deletado. Se houver excluí-lo. Em seguida, você pode procurar a seu serviço, usando a seguinte URL:

http://localhost/SimpleRESTService/EchoWithGet?s=Hello

 


Outros Idiomas

Este artigo está igualmente disponível nos seguintes idiomas:

Inglês (en-US)