Mostrando postagens com marcador WCF. Mostrar todas as postagens
Mostrando postagens com marcador WCF. Mostrar todas as postagens

quinta-feira, 23 de janeiro de 2014

Dica - Deploy WCF - HTTPS Environment

Geralmente quando desenvolvemos nosso WCF, e testamos localmente, ficamos felizes ao vê-lo executar com sucesso. Porém, um pequeno pesadelo pode ocorrer quando implantamos nosso serviço em um servidor do nosso cliente e erros estranhos começam a acontecer. Por exemplo, se o seu cliente instalou um certificado de segurança no IIS deste servidor (serviço SSL), as coisas podem ficar complicadas para nós. E como nosso serviço é por padrão criado no modelo HTTP, e não HTTPS, geralmente vamos nos deparar com a seguinte mensagem

Could not find a base address that matches scheme https for the endpoint with binding WebHttpBinding. Registered base address schemes are [http].

Nestes casos, uma dica rápida seria simplesmente [desabilitar] o modo de segurança do Binding usado no seu Endpoint.

Ao abrir seu Web.config padrão, gerado pelo Visual Studio, procure pela frase [security mode=] e altere para a sugerida abaixo. Inclusive, como outra dica, para funcionar a execução do seu WCF via execução JavaScript, use o Bind do tipo [webHttp].


<webHttpBinding> 
<binding crossDomainScriptAccessEnabled="true" name="webBinding"> 
<security mode="None">        
<transport clientCredentialType="None">
</transport>
</security> 
</binding> 
</webHttpBinding>


E se você estiver executando seu WCF em um servidor sem certificado (sem SSL) poderá verficar um exemplo completo neste Artigo.

Desta forma seu serviço vai ser executado com sucesso e o dia será ganho!... :)
[]s

Fontes: webHttpBinding

quarta-feira, 26 de junho de 2013

Depurando Serviços WCF com Fiddler

Existem projetos em WCF, que por sua natureza complexa, fica difícil depurar certos erros.

Por exemplo, imagine uma estrutura de projeto que comece com a execução de uma aplicação ASP.NET. Esta aplicação, por sua vez, possui em suas páginas chamadas Silverlight. Dentro desta camada Silverlight, existe uma outra chamada WCF, que executa a tecnologia EntityFramework para busca de informações em um banco de dados qualquer. Estrutura um pouco complicada não?!

Pode ter certeza que em algum momento, ocorrendo um erro lá na última camada do projeto (EntityFramework), o erro que irá aparecer para o desenvolvedor com certeza não será tão detalhado na primeira camada (ASP.NET).

Felizmente existe uma ferramenta muito boa para depurarmos melhor todo este processo, que se chama Fiddler.

A instalação e utilização desta ferramenta de [captura de chamadas WCF] para analisar em muito mais detalhes o erro ocorrido em sua aplicação é simples, como descrito abaixo:

1 - Efetue o download da ferramenta, acessando o site da Fiddler
2 - Instale a ferramenta (fiddler4setup.exe);
3 - Efetue o download e instale o extensor (BinaryMessageFiddlerExtension_0.2.zip) para chamadas WCF - WCF Binary-encoded Message Inspector for Fiddler
4 - Descompacte o arquivo [BinaryMessageFiddlerExtension_0.2.zip] e copie a dll [BinaryMessageFiddlerExtension.dll] para o diretório de instalação do Fiddler (\Program Files\Fiddler2\Inspectors)
5 - E por fim inicie o Fiddler



Com o fiddler iniciado, vá até a opção de Menu [Tools \ Fiddler Options] e configure qual a PORTA que deseja que o fiddler fique "escutando" solicitações HTTP.



Pronto. Quando você iniciar sua aplicação, verá que o fiddler (na aba INSPECTOR) mostrará os resultados das solicitações para você. Desta forma, poderá ver (na aba Inspectors \ TextView) a mensagem de erro em detalhes que precisa depurar.


Ref: Debugging WCF Service Calls


Abraços!

sexta-feira, 24 de agosto de 2012

CRM 2011 - Javascript + WCF

Olá Pessoal,

Talvez já tenham notado que executar um WCF via JavaScript não é tão fácil como parece ou como era a chamada de um tradicional Web Services .ASMX .
Isto porque por padrão, no WCF, este tipo de execução no Client vem desabilitado.
Desta forma, segue um tutorial para uma execução bem sucedida no seu JScript.

1 - Habilitar compatibilidade de execução ASP.NET na sua classe. Para tanto, adicione a diretiva, conforme exemplificado abaixo:


[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1


2 - Implementar as diretivas na sua INTERFACE de classe, conforme exemplo abaixo:

[ServiceContract]
public interface IService1
{
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Xml)]
string MyMethod(string p1, string p2);
}


3 - Implementar o seguinte WEB.CONFIG:
P.S.: Se você estiver executando uma URL segura (httpS) use a propriedade [httpsGetEnabled] senão [httpGetEnabled] na seção [serviceMetadata]
P.S.2: Não esqueça de trocar as frases [YOURNAMESPACE] e [YOURURL] pelas respectivas informações reais do seu projeto.


<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<identity impersonate="true" />
<customErrors mode="Off"/>

<httpModules>
<clear/>
</httpModules>

</system.web>

<system.serviceModel>

<standardEndpoints>
<webScriptEndpoint>
<standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
</webScriptEndpoint>
</standardEndpoints>

<services>
<service name="YOURNAMESPACE.Service1" behaviorConfiguration="ServiceBehaviors">
<endpoint name="Endpoint"
address="http://YOURURL/Service1.svc"
binding="webHttpBinding"
contract="YOURNAMESPACE.IService1"
behaviorConfiguration="WCFAjaxBehavior"
bindingConfiguration="webBinding" />
</service>
</services>

<behaviors>
<endpointBehaviors>
<behavior name="WCFAjaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>

<serviceBehaviors>
<behavior name="ServiceBehaviors">
<serviceDiscovery />
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />

<bindings>
<webHttpBinding>
<binding name="webBinding">
<security mode="Transport"></security>
</binding>
</webHttpBinding>
</bindings>

</system.serviceModel>

<system.webServer> <modules runAllManagedModulesForAllRequests="true"/>

<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type, Accept" />
</customHeaders>
</httpProtocol>

</system.webServer>
</configuration>


4 - E como último passo, a execução do seu WCF via JScript:

var url = "http://YOURURL/Service1.svc/MyMethod";

var client = null;
if (window.XMLHttpRequest)
client = new XMLHttpRequest();
else if (window.ActiveXObject)
client = new ActiveXObject("Microsoft.XMLHTTP");

var data = '{';
data += '"p1":"' + "SOMEVALUE" + '"';
data += ',';
data += '"p2":"' + "SOMEVALUE" + '"';
data += '}';

client.open ('POST', url, false);
client.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
client.send(data);
var resultValue = client.responseText;


That's It!