Contents tagged with Desenvolvimento

  • ASP.NET - WebApi e Cross-origin resource sharing (CORS)

    21/06/2016

    Cross-origin resource sharing (CORS) (ou compartilhamento de recursos cross-origem) é uma especificação de uma tecnologia de navegadores que define meios para um servidor permitir que seus recursos sejam acessados por uma página web de um domínio diferente.1Esse tipo de acesso seria de outra forma negado pela same origin policy. CORS define um meio pelo qual um navegador e um servidor webpodem interagir para determinar se deve ou não requisições cross-origem2 . É um acordo que permite grande flexibilidade, mas é mais seguro que permitir todos as requisições desse tipo.

    Quem trabalha no desenvolvimento de sistemas baseados em serviços (SOA) pode esbarrar por um problema que impede o uso de serviços criados serem consumidos por outras aplicações fora do mesmo domínio. 

    A minha situação é expor os Controllers, seus métodos da WebApi, para outros sistemas.

    Caso 1: uma aplicação desenvolvida para Android que precisa consumir métodos da WebApi da sua aplicação Web.

    Caso 2: um outro sistema Web hospedado em outro domínio precisa consumir métodos da WebApi da sua aplicação Web.

    Existem diversas soluções que vi, algumas muito complexas, outras mais simples, mas a que vi funcionar e sem depender de mexer nas aplicações que chamam os métodos depende apenas da implementação de uma classe de atributo e o uso deste na sua aplicação.

    public class EnableCorsAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext context)
        {
           context.ResponseHeaders.Add("Access-Control-Allow-Origin", "*");
        }
    }

    Veja que o conceito continua o mesmo, injetar no header quem pode acessar ao recurso.

    É necessário apenas decorar os métodos que serão expostos com a classe criada.

    [EnableCors]
    public HttpResponseMessage Get()
    {
        try
        {
          ...
    

    É uma solução que funciona e que pode servir de ponta pé inicial para outras, por exemplo, estender a classe EnableCorsAttribute para aceitar uma propriedade sobre qual domínio aceitar, assim podemos decorar expondo somente um domínio específico (ou vários), a solução apresentada expõe para todos (*).

    Referência: http://pt.wikipedia.org/wiki/Cross-origin_resource_sharing

     

     


  • Desenvolvimento para Smart TVs LG

    20/06/2016

    Um post sem entrar em detalhes, apenas para abertura da discussão.

    Após adquirir em 2014 uma Smart TV LG, que diga-se de passagem sem querer foi a melhor opção desse nicho, percebi como há carência em softwares, mas ligado a isso também há ainda uma certa nebulosidade sobre o que desenvolver, qual mercado, quem iria comprar o que e para que, pelo menos aqui no Brasil.

    Então basicamente os softwares mais úteis hoje são aqueles que disponibilizam conteúdo para os usuários, assim sendo, Terra, Band, Netflix e outros tem os seus softwares, bonitos (ou poderiam ser) que às vezes escondem uma certa precariedade, mas funcionais, fazendo o seu papel que é prover conteúdo.

    Ah claro, Facebook não poderia faltar na lista.

    quebrei pau com o Telecine (alô Telecine!) por não disponibilizar uma versão do Telecine Play para WebOS. O browser nativo até consegue acessar ao site deles e a algumas funções, mas não assistir a filmes, com isso perdem audiência para o Netflix, que possui um excelente software embarcado.

    Há ainda alguns outros softwares que poderiam ser considerados como boas opções, como jogos e utilitários, mas nem sempre o são também pela limitação da interação do usuário com a TV, a dependência de um controle remoto próprio que se diz "mágico".

    Mas porque a LG foi a melhor opção - sem querer fazer propaganda? WebOS!

    Além de aplicativos que podemos desenvolver, instalar e publicar para download na LG Store, há ainda diversas possibilidades de conexão com softwares desenvolvidos para smartphones.

    Além dos oficiais (ver na Google Play) que agem como controle remoto virtual pude testar alguns interessantes como por exemplo um que transmitia a câmera do smartphone para a TV via wireless.

    Ainda contando com alguns recursos interessantes como a LG Cloud (5GB gratuitos de armazenamento) e Time Machine (para gravação de programas - infelizmente apenas pela entrada RCA), essas somam às possibilidades de desenvolvimento (ver o SDK) como armazenamento em nuvem visto que sobram poucos gigabytes internos na memória nativa.

    Para fechar, só um exemplo de desenvolvimento, aquelas TVs como totens de propaganda, as que ficam rodando um feed de notícias em locais de grande concentração, porque não uma Smart TV conectada à rede local via wireless? A estrutura seria apenas um roteador wireless com Internet disponível (qualquer lugar tem), não seria necessário um servidor local com cabo de rede.

    [Atualização em 29 de abril de 2016]

    LG Smart World

    Fiz uma pergunta diretamente à LG sobre a situação do Telecine Play e vejam a resposta:

    Bem vindo ao LG Smart World

    Enviamos a resposta à sua pergunta por e-mail.

    Título

    Aplicativo Telecine Play/HBO Go ou que ele funcione no browser

    Contexto

    Boa tarde. Vocês tem alguma previsão de quando estará disponível um aplicativo que permita executar filmes do Telecine Play ou mesmo HBO Go? Pelo browser o vídeo stream não executa, apesar de o site abrir. Obrigado.

    Resposta

    Olá, Richardson

    Agradecemos que tenha acessado nosso site.

    Compreendemos o seu relato e informamos que a plataforma Smart TV recebe atualizações constantemente, a fim de acompanhar as tendências de entretenimento do mercado.

    Por esta razão, esclarecemos que até o presente momento não recebemos informações sobre a disponibilidade destes aplicativos em nossos produtos. Entretanto, utilizaremos sua solicitação como sugestão para empresa, pois sabemos que detalhes são importantes para melhorias na interatividade que nossa plataforma oferece.

    Assim, orientamos que acesse o site www.lgappstv.com e através da sua conta verifique sempre que possível a disponibilidade dos aplicativos para instalar.

    Caso tenha alguma outra dúvida nos contate. Será um prazer atendê-lo novamente.

    Atenciosamente,

    LG SMART TV Team


  • PetaPoco - Como mapear um relacionamento Many-to-Many (simulação de Lazy Load)

    20/06/2016

    Há algum tempo estou utilizando a micro ORM PetaPoco para alguns projetos pessoais, a grande vantagem é o desempenho, liberadade e facilidade de implementação.

    Eu poderia utilizar Entity Framework ou NHibernate, que são mais parrudos e completos, e que inclusive uso em outros projetos, mas o objetivo é justamente descomplicar e deixar o funcionamento o mais leve possível.

    O objetivo deste artigo é exemplificar de forma simples e tornar fácil o entendimento de algo que garimpei na Internet e vi muitos artigos, bons, ruins, completos, incompletos, outros bem direitos, outros com muitos frufrus.

    Vamos exemplificar então, à começar com algumas definições básicas:

    • View - uma view, oras, então temos Título e outras propriedades que a formam.
    • Campo - é um elemento que compõe uma View. 
    • CampoView - agregação de todos os Campos que compõem Views. Uma View exibe para o usuário um Campo para digitação de nome, outro para digitação de Valor e etc.

    Fazendo uma analogia para facilitar o entendimento:

    • Pedido de Venda = View.
    • Produto = Campo.
    • Itens do Pedido de Venda = CampoView.

    Um mapeamento many-to-many tem a característica de um agregado como coleção, na prática a maneira como isso ocorre é por "lazy load" (ou não) a lista dos agregados é carregada quando solicitada, não quando o objeto é instanciado.

    Então em se tratado de consulta a banco de dados pelas classes quando carregamos uma View é feita a consulta apenas na tabela relacionada, quando consultamos os Campos agregados à instância da View é feita uma consulta apenas para isso.

    Mão na massa então

    (não estou atentando para a definição da classe de forma correta ao PetaPoco)

    public class CampoView
    {
        public Guid IdView { getset; }
    
        public Guid IdCampo { getset; }
    
        [Ignore]
        public Campo Campo { getset; }
    }
    
    
    
    Veja que a classe CampoView possui a propriedade Campo (1) decorada com um Ignore do PetaPoco.
    
    

    Dica: Propriedades decoradas com o atributo Ignore não participam das atribuições dinâmicas de campos feitas pelo PetaPoco em Query/Fetch.

    public class Campo
    {
        public Guid Id { getset; }
        public string Nome { getset; }
    
        public int Largura { getset; }
    }
    
    
    
    Nada demais na classe Campo.

    Dica: para quem não sabe o PetaPoco trabalha automaticamente com campos CHAR(36) em formato Guid sem precisarmos fazer conversões, quando atribuímos uma string no formato Guid ele já faz as conversões necessárias.

    
    
    public class View
    {
        public Guid Id { getset; }
        public string Titulo { getset; }     [Ignore]     public List<CampoView> Campos     {         get         {             var sql = PetaPoco.Sql.Builder                 .Append("SELECT camposviews.*, campos.*")                 .Append("FROM camposviews, campos")                 .Append("WHERE (campos.Id = camposviews.IdCampo)")                 .Append("  AND camposviews.IdView = @0"new object[] { this.Id });                          var lista = SeuRepositorioPetaPoco.Query<CampoViewCampo>(sql);             return lista.ToList();         }     } }

    A classe View é o ponto central do artigo.

    Vejam que a propriedade Campos também está decorada com Ignore.

    Detalhando a implementação

    var sql = PetaPoco.Sql.Builder

       .Append("SELECT camposviews.*, campos.*")
       .Append("FROM camposviews, campos")
       .Append("WHERE (campos.Id = camposviews.IdCampo)")
       .Append("  AND camposviews.IdView = @0"new object[] { this.Id });

    Lembrando que estamos contextualizados em uma instância de View, esta é uma simples query com inner join para a tabela de Campos para então montar a relação de Campos desta View, por isso o parâmetro this.Id (da view) para o IdView da tabela de agregação.

    A execução desta query irá listar todos os Campos agregados da View em contexto.

    
    
    var lista = SeuRepositorioPetaPoco.Query<CampoViewCampo>(sql);

    Já esta linha fará as atribuições dos campos projetados pela query executada.

    Por padrão do PetaPoco a execução desta query irá gerar uma lista de CampoView, a propriedade Campo (1) da classe CampoView irá fazer com que os campos projetados da tabela campos sejam atribuídos como instância automaticamente.

    Resumo

    1. Três classes, pai, filho, agregação dos filhos do pai.
    2. Execução da query montando a agregação e atribuindo o resultado gerando instâncias.

    Referências:

    • http://www.toptensoftware.com/petapoco/
    • http://blogs.lessthandot.com/index.php/desktopdev/mstech/csharp/petapoco-mapping-related-objects/
    • http://www.toptensoftware.com/Articles/115/PetaPoco-Mapping-One-to-Many-and-Many-to-One-Relationships


  • Tentativa de hacking a meus sites

    20/06/2016

    Tenho alguns sites de projetos pessoais que ainda estão em fase de desenvolvimento e outros já funcionais em versão beta eterna :), mas não faço divulgação, enfim, são sites de serviços que deixo expostos na Internet e são indexados por serviços de pesquisa como o Google e Bing.

    Recebo por e-mail além dos indicadores do Google Analytics, também logs de erros de acesso.

    Já fiz tratamentos de acessos pelo bot de indexação do Google forçando erros de rotas, mas esta semana recebi alguns erros interessantes de acessos a rotas em um site meu baseadas na lista abaixo:

    • plus/e7xue.php
    • plus/mytag_js.php
    • plus/download.php

    Pesquisando um pouco descobri que se trata de hackers tentado achar falhas no site, na verdade falhas em algum CMS porventura instalado (ex.: Joomla, Drupal e outros), nesse caso acho que o Drupal, mas que não é o meu caso.


    Outro possíveis arquivos exploráveis:

    • sites/default/files/css/css...
    • sites/default/files/js/js...
    • components/com_community/index.html 

    Interessante é que isso só aconteceu agora por que eu imagino ter hospedado o site - ainda - no GoDaddy, que é internacional, talvez disponível em alguma lista afora de sites.

    Enquanto ficou alguns meses no Brasil e nunca sofreu esse tipo de tentativa.


  • Javascript :: console.log() + console.trace()

    20/06/2016

    Quem desenvolve usando client side frameworks (ex.: Bootstrap, ExtJS e outras) de vez em quando se pega usando console.log() para rastrear a execução, mesmo que o debug seja mais eficiente.

    Uma dica interessante para casos assim é usar em conjunto com o console.log() - usado para colocar conteúdo visível no console do browser - também o console.trace(), assim poderá rastrear não só a chamar à função, mas também o contexto de chamada e parâmetros passados.


  • Javascript :: quando a expressão true == true retorna false

    20/06/2016

    Recentemente precisei fazer uma validação de valor boolean vindo de um request Ajax.

    A lógica seria mais ou menos:

    // retornoRequest.Campo tinha o valor "true" (via debug e console).

    if (retornoRequest.Campo == "true")

    {

       "faça"

    }

    Mas essa verificação estava dando falso por algum motivo.

    Mesmo comparar com === "true" também.

    Então a solução:

    if (retornoRequest.Campo.toString() == "true")

    {

       "faça"

    }

    Somente aplicando forçadamente a conversão para string que foi possível usar o valor real da expressão, estranhamente pois pelo visual os valores eram iguais. Não avaliei o tipo, mas certamente estava nisso o problema.


  • WebAPI e retorno de campo DateTime - Request Ajax trazendo valor em formato texto ao invés de objeto tipo DateTime

    16/06/2016

    Detalhando a Situação

    Recentemente passei por um problema de programação que já havia passado antes, mas contornado "via código".

    O problema não é incomum e depende exclusivamente de como você precisa tratar tal tipo de conteúdo em sua View.

    Considere o seguinte fluxo (sem entrar em muitos detalhes): 

    1. View faz o request Ajax a um Método no Controller WebAPI.
    2. Método processa e retorna um registro ou lista do Domínio.
    3. Método converte dados do Domínio para DTO.
    4. Método retorna os dados para a View.

    Uma classe DTO é uma simplificação da classe de Domínio e é usada como container para serialização no retorno dos valores/registros lidos do banco de dados para a View que fez a requisição.

     

    O Problema

    O método da WebAPI retorna para a View usando o método Request.CreateResponse().

    No meu caso utilizo ExtJS como framework como client/browser, então os requests avulsos da view são feitos com a função Ext.Ajax.request(). Não testei usando jQuery, mas creio que não haja diferença.

    Quando um request é feito as propriedades do tipo DateTime retornam o valor como texto no seguinte formato: 2014-01-01T00:00:00. Só que para ser trabalhando na view de maneira direta, ou seja, cálculos, componentes que só recebem valor data/hora (ou data), é preciso que esse texto seja convertido para um objeto de data Javascript, algo como Date {Mon Jan 01 2014 00:00:00 GMT-0200}.

    Considerando um request feito por uma Store do Ext.Net (abstração do ExtJS), se apontamos para o mesmo método no controller da WebAPI, e configurado o Record Field da Store com algo assim: 

    <ext:RecordField Name="PropriedadeDataNoDto" Type="Date" DateFormat="yyyy-MM-ddTh:i:s" />


    Desta maneira a view consegue fazer com que o retorno seja o esperado, um objeto data/hora.

     

     

    A Solução

    A solução definitiva que encontrei, a que implica que todas as requisições no nível de WebAPI fiquem corretas, está relacionada a configurar um "JsonFormatter" aplicado na serialização do conteúdo, mas não encontrei nenhuma solução para a minha necessidade, nem mesmo os "formatters" padrões tipo ISO e outros, então tive que adequar uma.

    Criei uma classe formatter chamada JavaScriptDateTimeConverter (atenção que existe uma classe com mesmo nome).

    public class JavaScriptDateTimeConverter : DateTimeConverterBase
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.Value is DateTime)
            {
                return DateTime.Parse(reader.Value.ToString());
            }
            else
            {
                return reader.Value;
            }
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (value == null)
            {
                writer.WriteNull();
            }
            else if (value is DateTime)
            {
                DateTime dateTime = (DateTime)value;
    
                // retornará a data no padrão: new Date(year, month, day, hours, minutes, seconds, milliseconds);
                writer.WriteStartConstructor("Date");
                writer.WriteValue(dateTime.Year);
                writer.WriteValue(dateTime.Month - 1);
                writer.WriteValue(dateTime.Day);
                writer.WriteValue(dateTime.Hour);
                writer.WriteValue(dateTime.Minute);
                writer.WriteValue(dateTime.Second);
                writer.WriteEndConstructor();
            }
            else
            {
                writer.WriteValue(value.ToString());
            }
        }
    }

    E em WebApiConfig.cs a lógica para que a classe seja utilizada.

    public static class WebApiConfig    {
      public static void Register(HttpConfiguration config)
      {
        ...
        config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new SuaNamespace.JavaScriptDateTimeConverter());
        ...
      }
    }

    Um ponto que não avaliei, pode ser que fazendo um request com algum parâmetro a mais o retorno de propriedades/campos DateTime ocorra como o esperado, mas infelizmente não pude testar, de qualquer não encontrei em nenhum artigo referência a essa possibilidade.


  • Como fazer para acessar o Servidor de Desenvolvimento do ASP.NET por uma rede local

    16/06/2016

    Como qualquer desenvolvedor ASP.NET, independente do software que estamos desenvolvendo e tecnologias envolvidas, de vez em quando pensamos "como seria bom se eu pudesse permitir que fulano testasse no código que estou mexendo".

    Bem, para isso funcionar é preciso compartilhar a aplicação web com alguém, até aí nada demais, podemos configurar a mesma para utilizar o IIS ou mesmo o IIS Express, o que não é a forma comum e tem algumas implicações, por isso na grande maioria dos casos por padrão utilizamos o servidor web nativo iniciado pelo Visual Studio.

    Uma outra vantagem de podermos compartilhar a aplicação web do código em desenvolvimento com alguém é para fins de depuração (debug), podendo fazer acertos pontuais em tempo real para o tester avaliar na hora.

    Como fazer?

    O segredo está em um conceito bastante antigo chamado Port Fowarding, ou seja, redirecionamento de porta.

    Resumindo, como o Servidor de Desenvolvimento ASP.NET não pode dar as caras "por ele só", mesmo que abramos a porta dele no Firewall, então para conseguir acessa-lo criamos um tipo de túnel, por exemplo, se sua aplicação está rodando localmente pela porta 8888 (meu caso - ver acima), eu posso "servi-la" na porta 80 simulando como se fosse um servidor web operando na porta padrão, mas poderia ser outra.

    Qual ferramenta utilizar?

    Em várias pesquisas encontrei diversos artigos citando soluções em Java, nesses casos além de precisar da JRE instalada (99,9% das pessoas tem em seus computadores) e verificar a versão da mesma, também é preciso um pacote compilado (.jar) obsoleto que existe rodando na Internet, apesar de ter visto outros, entrar no Prompt de Comando e executar um comando "java.exe blabla.jar...", após isso é possível acessar de fora do computador.

    Então achei a solução ideal, um programinha chamado SPI Port Forward, muito simples de usar, abaixo um screenshot da configuração do meu.

    • Local port é a porta que será exposta e precisa estar liberada no Firewall.
    • Remote port é a porta que o Servidor de Desenvolvimento ASP.NET está servindo.
    • Aperta Activate para passar a servir na porta escolhida.

    Lembrar também que para funcionar não pode haver outra aplicação usando a mesma porta que estiver sendo compartilhada, por exemplo, se usar a porta 80 o IIS ou outro não pode estar usando a mesma porta para algum site, que por padrão estará, nesse caso basta então parar o serviço ou trocar a porta.

    O programa pode ser baixado deste link http://staticvoidmain.cognitioab.se/wp-content/uploads/2013/01/PortForward.exe.

    Referências:

    • http://staticvoidmain.cognitioab.se/index.php/2013/01/remote-debugging-asp-net-development-server-with-spi-port-forward/
    • http://web.archive.org/web/20100925095856/http://www.pluralsight-training.net/community/blogs/jimw/archive/2010/08/18/iphone-accessing-the-visual-studio-asp-net-development-server-windows-7-update.aspx


  • NHibernate + Fluent - Referência nula ou com chave estrangeira inválida

    16/06/2016

    Recentemente esbarrei com uma situação de mapeamento de um banco de dados que possui uma tabela com um campo que é chave estrangeira com referência em outra tabela, só que esse valor pode não existir ou ser nulo.

    Contextualizando a situação:

    Tabela1

    Campo1PK

    Campo2

    Campo3FK (ref. Tabela2)

    Tabela2

    Campo1PK (referência para o campo Tabela1.Campo3FK ou qualquer outra tabela)

    Campo2

    Até aí nada demais, mas então por um motivo ou outro o campo Tabela1.Campo3FK é do tipo "solto", ou seja, você pode colocar o valor que quiser que não há Integridade Referencial, ou seja, você coloca o código 4, quando não existe o registro em Tabela2.Campo1PK com mesmo código, mas não há nada que critique essa falta.

    E aí, como mapear? O NHibernate numa situação dessa gerará/levantará uma exceção.

    Simples, digamos que a classe/tipo de domínio da Tabela2 se chame Tabela2Type, então na sua classe de domínio Tabela1 existirá algo como:

    public virtual Tabela2Type Tabela2 { getset; }
    

    Na classe de mapeamento (Fluent) haverá a seguinte configuração:

    References(x => x.Tabela2"Campo3FK").Nullable().NotFound.Ignore();

    Sendo que .Nullable() será para aceitar valores nulos, e .NotFound.Ignore() considerará o caso de não existindo o valor seja ignorado não levantando uma exceção nesse caso.


  • What, Why and How About SignalR

    16/06/2016

    By Abhishek Goswamiwww.c-sharpcorner.com

    • December 1st, 2013

    What is SignalR

    We know very well how a client sends data to a server so now it's time to understand how a server pushes data to a client in a HTTP connection. SignalR is an open source library to add real-time web functionality in your ASP.Net web application. So what does real-time functionality mean? Just use as an example when more than 1 user is working on the same document in Google Documents When a user is making changes and at the same time another user can see the changes without reloading the page. So real-time web functionality is the ability to have server code to push content to connected clients. In the HTTP request response model we know each time we need to send a new request to communicate with the server but SignalR provides a persistent connection between the client and server.

    It can be easily scaled out via SQL Server, Redis or a service bus (scale out means adding more servers to handle the load). There is no need to worry about this scale out term, in my next article I will explain it in detail because SignalR provides good scale out features. SignalR uses Web socket technology to send data. WebSocket is a new HTML5 API that enables bidirectional communication between the browser and server but if it is not available then SignalR can use other technologies like long polling.

    SignalR transfers data in non-compressed JSON text or plain text so if you want to send data in compressed JSON then you need to write your own logic on the server side and the same logic on the client side also. SingnalR makes extensive use of asynchronous techniques to achieve immediate and maximum performance.

    Modes of communication

    SignalR provides two models for communicate between clients and severs.

    1. Persistent Connections

    Persistent Connections provide direct access to a low-level communication protocol that signalR provides. Each client connection to a server is identified by a connectionID. So in your application if you need more control over a connection, in SingnalR you can use this model. This midel can be used where you want to work with a messaging and dispatching model rather than remote invocation or in any existing application using a message model and you want to port to signalR.

    2. Hubs

    Hubs provide a High level API for the client and server to call each other's method. It will be very familiar to those developers who have worked on remote invocation APIs. If you have multiple types of messages that you want to send between a server and a client then it is recommended to use Hubs so you don't need to do your own dispatching. You can create an application either using Hubs or a Persistent connection; the only concern is, with Hubs it will be easy to implement.

    So now we have an idea of what SignalR is so now it's time to proceed to "why".

    WHY use SignalR

    Using SignalR we can create web applications that require high frequency updates from the server. For examle, a dashboard, games and chat applications. SignalR uses Web Sockets and the HTML5 API that helps in bidirectional communication. It also provides an API for server-to-client Remote Procedure Calls (RPC) call, it may be something new for you because most of the time we use a request and response model.

    SignalR includes automatic connection management, it provides the facility to broadcast messages to all connected clients or to a specific client. The connection between the client and server is persistent while in HTTP it isn't persistent.

    So now where to use SignalR:

    1. Notification: If you want to notify 1 client or all clients then we can use SignalR. Notification can be like some alerts, a reminder, feedback or comments and so on.
    2. Chat: It is very easy to implement a chat application using SignalR, either it could be one-to one or a group chat.
    3. Gaming: SignalR helps to create a Gaming application that requires frequently pushing from a server and so on.

    HOW use SignalR

    Here I am not going to directly jump into code. I will first explain how a Remote Procedure Call (RPC) happens.

    Let's assume that on the server side we have a method named MyServerFunction() so if we want to call that method from a client you can call it using "$.connection.myHub.server.MyServerFunction()" and suppose we have a JavaScript function named "myClientFunction()" and we want to call that method from the server so we can call that using "Client.Client(id). myClientFunction()".

    I know many of you are thinking, what are this connection, hub and server keywords. So please be patient, very shortly I will explain all these when I will explain both modes (persistent and hubs) in details.

    See the following diagram for a better understanding.

    As you can see, during the RPC using SignalR the hub will be at the server side and the client will have a hub proxy. When the proxy object wants to call a real method of the server, the object implements Ajax style calls to the real method. Whereas when the server wants to invoke the client method , it is resolved using dynamic types and a special protocol that packages these calls to the server.

    When an application has a SignalR connection and it wants to send some data to the server, the data is not sent in a raw form, SignalR wraps that data in JSON with other information and wraps it all on the JOSON payload before sending to the server.

    I think we have explained many concepts about SignalR. I know many of you are feeling bored but don't worry, in my next article I will have with all the coding and implementation about SignalR. I wrote this article because I didn't find any article on SignalR that can explain all concepts and how SignalR works. Thanks for reading and be ready for the next article.

    Ref.: http://www.c-sharpcorner.com/UploadFile/abhijmk/what-why-and-how-about-signalr/