none
Consumindo WCF com Restful RRS feed

  • Pergunta

  • Amigos, desenvolvi um serviço WCF com Rest. Publiquei ele no IIS e quando acesso o endereço do serviço, ele funciona perfeitamente, no entanto, quando faço o request, ele me apresenta um erro 404.

    Durante o debug, ele funciona perfeitamente, retornando o XML conforme todos os UriTemplate desenvolvidos.

    O endereço do meu serviço é http://localhost:1981/servico.svc

    Ele deveria me retornar os dados dos clientes com a seguinte linha: http://localhost:1981/servico.svc/clientes

    Alguém pode me ajudar?
    segunda-feira, 2 de março de 2009 18:12

Respostas

  • Boas Luiz,

    Sim, mas não tem nada de muito especial:

      <system.serviceModel> 
        <services> 
          <service name="Service" behaviorConfiguration="ServiceBehavior">  
            <endpoint address="" binding="webHttpBinding" contract="IService">  
            </endpoint> 
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>  
          </service> 
        </services> 
        <behaviors> 
          <serviceBehaviors> 
            <behavior name="ServiceBehavior">  
              <serviceMetadata httpGetEnabled="true"/>  
              <serviceDebug includeExceptionDetailInFaults="false"/>  
            </behavior> 
          </serviceBehaviors> 
        </behaviors> 
      </system.serviceModel> 

    http://www.projetando.net
    quarta-feira, 4 de março de 2009 12:11
    Moderador
  • Olá Luiz,

    Para usar o WCF no modo REST, você precisa adicionar o WebHttpBehavior ao endpoint, além de usar o webHttpBinding (em vez de wsHttpBinding):

    <services> 
        <service behaviorConfiguration="WCFClientes.Service1Behavior" 
                 name="clientesBaseClasses.Fachada">  
            <endpoint address="clientesBaseClasses.Fachada.svc"   
                      binding="webHttpBinding" contract="clientesBaseClasses.IFachada" 
                      behaviorConfiguration="RESTBehavior">  
                <identity> 
                    <dns value="localhost" /> 
                </identity> 
            </endpoint> 
            <host> 
                <baseAddresses> 
                    <add baseAddress="http://localhost:8731/Design_Time_Addresses/WCFClientes/Service1/" /> 
                </baseAddresses> 
            </host> 
        </service> 
    </services> 
    <behaviors> 
        <endpointBehaviors> 
            <behavior name="RESTBehavior">  
                <webHttp /> 
            </behavior> 
        </endpointBehaviors> 
    </behaviors> 
    sexta-feira, 13 de março de 2009 19:51

Todas as Respostas

  • Boas Luiz,

    Qual a UriTemplate que definiu?
    http://www.projetando.net
    terça-feira, 3 de março de 2009 04:42
    Moderador
  • Defini duas UriTemplates:

    Retorna todos os Clientes:
    [WebGet(UriTemplate = "clientes", ResponseFormat = WebMessageFormat.Xml)]

    Retorna uma quantidade limitada de Clientes:
    [WebGet(UriTemplate = "{p_Quantidade}/clientes")]

    Eu ainda defini uma para apresentar uma mensagem de erro:
    [WebGet(UriTemplate = "")]

    Arquivo web.config

    <services>
          <service behaviorConfiguration="WCFClientes.Service1Behavior"
            name="clientesBaseClasses.Fachada">
            <endpoint address="clientesBaseClasses.Fachada.svc"
                        binding="wsHttpBinding" contract="clientesBaseClasses.IFachada">
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8731/Design_Time_Addresses/WCFClientes/Service1/" />
              </baseAddresses>
            </host>
          </service>
        </services>
    terça-feira, 3 de março de 2009 13:48
  •  Boas Luiz,

    Você fala:

    "Ele deveria me retornar os dados dos clientes com a seguinte linha: http://localhost:1981/servico.svc/clientes"

    Se você tem uma UriTemplate somente com este valor, ela deveria retornar. Para simular, eu fiz o mesmo teste aqui:

    [ServiceContract]  
    public interface IService  
    {  
        [OperationContract]  
        [WebGet(UriTemplate = "clientes", ResponseFormat = WebMessageFormat.Xml)]  
        string[] RecuperarDados();  

    E, em seguida, publiqui no IIS e tudo resultou como era de se esperar. A Url para acessar foi: http://localhost/SrvTeste/Service.svc/clientes.
    http://www.projetando.net
    terça-feira, 3 de março de 2009 16:53
    Moderador
  • Israel, você poderia postar o seu app.config ?

    Veja:

    [WebGet(UriTemplate = "clientes", ResponseFormat = WebMessageFormat.Xml)]
    [OperationContract]
    XElement obterTodosClientes();

    terça-feira, 3 de março de 2009 18:34
  • Boas Luiz,

    Sim, mas não tem nada de muito especial:

      <system.serviceModel> 
        <services> 
          <service name="Service" behaviorConfiguration="ServiceBehavior">  
            <endpoint address="" binding="webHttpBinding" contract="IService">  
            </endpoint> 
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>  
          </service> 
        </services> 
        <behaviors> 
          <serviceBehaviors> 
            <behavior name="ServiceBehavior">  
              <serviceMetadata httpGetEnabled="true"/>  
              <serviceDebug includeExceptionDetailInFaults="false"/>  
            </behavior> 
          </serviceBehaviors> 
        </behaviors> 
      </system.serviceModel> 

    http://www.projetando.net
    quarta-feira, 4 de março de 2009 12:11
    Moderador
  • Olá Luiz,

    Para usar o WCF no modo REST, você precisa adicionar o WebHttpBehavior ao endpoint, além de usar o webHttpBinding (em vez de wsHttpBinding):

    <services> 
        <service behaviorConfiguration="WCFClientes.Service1Behavior" 
                 name="clientesBaseClasses.Fachada">  
            <endpoint address="clientesBaseClasses.Fachada.svc"   
                      binding="webHttpBinding" contract="clientesBaseClasses.IFachada" 
                      behaviorConfiguration="RESTBehavior">  
                <identity> 
                    <dns value="localhost" /> 
                </identity> 
            </endpoint> 
            <host> 
                <baseAddresses> 
                    <add baseAddress="http://localhost:8731/Design_Time_Addresses/WCFClientes/Service1/" /> 
                </baseAddresses> 
            </host> 
        </service> 
    </services> 
    <behaviors> 
        <endpointBehaviors> 
            <behavior name="RESTBehavior">  
                <webHttp /> 
            </behavior> 
        </endpointBehaviors> 
    </behaviors> 
    sexta-feira, 13 de março de 2009 19:51
  • Olá galera, pegando o bonde andando... Estou tendo problemas com meus serviços, e acabei lendo este post aqui.

    Porém, me deparei com a primeira resposta do Carlos Figueira. E ele diz que é necessário adicionar algumas configurações no web.config porém eu não sei onde colocá-las, pois, meu arquivo não tem nenhuma entrada nem parecida com a demonstrada aqui. Alguém pode me dar uma luz?

    Dêem uma olhada:

    <?xml version="1.0"?>
    <configuration>
    	<configSections>
    		<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    			<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    				<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
    				<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    					<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>
              <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
    					<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
    					<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
    				</sectionGroup>
    			</sectionGroup>
    		</sectionGroup>
    	</configSections>
    	<appSettings/>
    	<connectionStrings/>
    	<system.web>
    		<compilation debug="true">
    			<assemblies>
    				<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
    				<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			</assemblies>
    		</compilation>
    		<authentication mode="Windows"/>
    		<pages>
    			<controls>
    				<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			</controls>
    		</pages>
    		<httpHandlers>
    			<remove verb="*" path="*.asmx"/>
    			<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
    		</httpHandlers>
    		<httpModules>
    			<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    		</httpModules>
    	</system.web>
    	<system.codedom>
    		<compilers>
    			<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    				<providerOption name="CompilerVersion" value="v3.5"/>
    				<providerOption name="WarnAsError" value="false"/>
    			</compiler>
    		</compilers>
    	</system.codedom>
    	<system.webServer>
    		<validation validateIntegratedModeConfiguration="false"/>
    		<modules>
    			<add name="ScriptModule" preCondition="integratedMode" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    		</modules>
    		<handlers>
    			<remove name="WebServiceHandlerFactory-Integrated"/>
    			<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    			<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    		</handlers>
    	</system.webServer>
    </configuration>
    

    Eu sei que isso tá muito grande, mas, se puderem me ajudar... É pro meu TCC... Ajudem um pobre mortal...

    :'(

     

    Vlwzz... Abrazzzz

     

     

    • Editado Rafael Orsini Fernandes segunda-feira, 8 de novembro de 2010 02:35 Redução de espaços desnecessários entre as linhas do código XML.
    segunda-feira, 8 de novembro de 2010 02:33
  • Boas Rafael,

    Vamos do começo: você quer criar um serviço REST ou ele já está criado e você está com dificuldades em consumir?!


    http://www.israelaece.com
    quinta-feira, 18 de novembro de 2010 10:43
    Moderador