segunda-feira, 9 de dezembro de 2013

Invocar serviços WCF via JSON endpoint numa página HTML - 3

No artigo anterior, vimos como fazer um pedido POST para invocar serviços de domínio WCF para operações de alteração, usando o endpoint JSON. Fizemos um exemplo com as páginas HTML e os serviços WCF no mesmo servidor Web (na verdade estavam mesmo no mesmo projeto do Visual Studio).

Vamos aqui tratar de conseguir fazer a mesma invocação, mas tendo a aplicação front-end (HTML) num servidor diferente do servidor dos serviços WCF. Isto implica uma invocação entre servidores (cross-server ou cross-origin).

Quando colocamos as páginas Web (callWCF.html  e  callWCF_Insert.html, nos artigos anteriores) num servidor diferente dos serviços WCF, passamos a obter os seguintes erros:

1 - Ao correr callWCF.html, que invoca o serviço ...svc/JSON/GetCars:





2 - Ao correr callWCF_Insert.html, que invoca o serviço ...svc/JSON/SubmitChanges:










Em ambos os casos ocorre um erro "No 'Access-Control-Allow-Origin' header is present...", o qual podemos resolver acrescentando o seguinte bloco no ficheiro Web.config:
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
    <add name="Access-Control-Allow-Methods" value="GET, POST" />
    <add name="Access-Control-Max-Age" value="1728000" />
  </customHeaders>
</httpProtocol>


Quanto ao problema relativo a "405 (Method Not Allowed)", o mesmo deve-se a estar a ser feito um pedido OPTIONS e o servidor não estar preparado para o receber. Podemos resolver isso criando uma classe global da aplicação (ficheiro global.asax):


E depois modificar o método Application_BeginRequest(...) como se segue:

protected void Application_BeginRequest(object sender, EventArgs e)
{
   HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

   if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
   {
      HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
      HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
      HttpContext.Current.Response.End();
   }
}

Este método resolve ambos os problemas anteriores, e dispensa o código acrescentado no web.config.

Pode ainda ser necessário fazer alterações ao nível do IIS no servidor onde são alojados os serviços WCF (ver referência 3 abaixo).

Referências:

Artigos relacionados:

Sem comentários:

Enviar um comentário