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:
- http://enable-cors.org/
- http://www.dotnet-tricks.com/Tutorial/wcf/X8QN260412-Calling-Cross-Domain-WCF-Service-using-Jquery.html
- http://www.dotnetguy.co.uk/post/2010/02/28/iis7-does-not-allow-cross-domain-calls-in-full-trust-mode-by-default-the-fix/
Artigos relacionados:
- Criar Modelo de dados EntityFramework e Serviços WCF a partir da Base de Dados, e
- Disponibilizar Serviços WCF em JSON
- Invocar serviços WCF via JSON endpoint numa página HTML - 1
- Invocar serviços WCF via JSON endpoint numa página HTML - 2
Sem comentários:
Enviar um comentário