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:
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: