Em meus estudos recentes de WCF encontrei uma biblioteca JavaScript que facilita o trabalho de criação de clientes Web. Trata-se do ProxyService.js, desenvolvida pelo MVP Rick Strahl. A biblioteca utiliza JSON e jQuery para realizar a consulta ao serviço WCF, deixando a tarefa bem simples para o desenvolvedor.

Abaixo coloquei um exemplo simples de como podemos criar um client JavaScript para invocar um serviço WCF. No final do artigo você encontra o download da solução completa.

O código abaixo mostra como devemos escrever nossa interface de serviço.

using System.ServiceModel;
using System.ServiceModel.Web;

namespace WCFTestes
{
    [ServiceContract(Namespace = "", Name = "Servicos")]
    public interface IServicos
    {
        [OperationContract]
        [WebInvoke(
            BodyStyle = WebMessageBodyStyle.WrappedRequest, 
            ResponseFormat = WebMessageFormat.Json)]
        string Ping(string value);
    }
}

O detalhe importante no código acima é decorar o método Ping com o atributo WebInvoke, conforme vemos nas linhas 10 a 12. Dessa forma, o formato resultante será do tipo JSON. Será necessário adicionar uma referência a System.ServiceModel.Web.

Em seguida, vemos como devemos decorar o nosso método (linha 6) para que possamos compatibilizar o serviço com o client JavaScript.

using System.ServiceModel;
using System.ServiceModel.Activation;

namespace WCFTestes
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class Servicos : IServicos
    {
        public string Ping(string value)
        {
            return string.Format("Hello {0}", value);
        }
    }
}

Por fim, devemos criar um behavior no web.config indicando o atributo enableWebScript, conforme a linha 13, e devemos associar o behavior criado ao endpoint (linha 6).

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
        <service name="WCFTestes.Servicos" 
                 behaviorConfiguration="WCFTestes.ServicosBehavior">
            <endpoint behaviorConfiguration="WCFTestes.AtividadeAspNetAjaxBehavior" 
                      binding="webHttpBinding" contract="WCFTestes.IServicos"/>
        </service>
    </services>
    <behaviors>
        <endpointBehaviors>
            <behavior name="WCFTestes.AtividadeAspNetAjaxBehavior">
                <enableWebScript/>
                <webHttp/>
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="WCFTestes.ServicosBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Os detalhes acima descritos são importantes para que o serviço WCF consiga gerar um response que pode ser lido pelo client JavaScript.

Para utilizar a biblioteca ServiceProxy.js você deve fazer como no exemplo abaixo. Na linha 2 criamos o proxy passando como parâmetro o endereço do nosso serviço WCF. Da linha 5 a 10 invocamos o serviço passando como primeiro parâmetro o nome do WebMethod, em seguida passamos os parâmetros do WebMethod. Em seguida, manipulamos o resultado, exibindo o resultado em um alert.

<script language="javascript">
    var proxy = new ServiceProxy("http://localhost:50564/Servicos.svc/");
    
    function InvokeWCF() {
        proxy.invoke("Ping", { value: "Leandro" },
                  function(result) 
                  {
                      alert(result);
                  },
                  onPageError);           
    }

    function onPageError(error) {
        alert("Ocorreu um erro: " + error.message);
    }
</script>

O código-fonte completo deste post pode ser baixado no link abaixo.