Web Commands

Quando falamos de CQRS, temos as consultas e os comandos. Esses comandos podem ser consumidos diretamente por aplicações, mas como expor publicamente para os clientes? Uma opção comum nos dias de hoje é utilizar o protocolo HTTP, facilitando assim o consumo pelas mais diversas linguagens e tecnologias. E quais as opções no .NET para fazermos esta exposição?

O ASP.NET é um candidato para isso, já que em sua versão core está modularizado e flexível, e assim podemos otimizar o pipeline de execução com somente aquilo que seja de fato necessário para executar os comandos. A finalidade do vídeo abaixo é exibir uma forma alternativa para incorporar os comandos do domínio no ASP.NET, utilizando o mínimo de recursos possível do hosting. Link para o código do exemplo.

NVarchar e NHibernate

Pode não ser novidade, mas as vezes podemos cair em algumas armadilhas que se não ficarmos atentos, podemos ter problemas de performance relacionados à campos do tipo de dado string. Apesar de focar o artigo no NHibernate, não é um problema somente dele, na verdade, acaba sendo mais um problema do banco de dados, pois ele pode acontecer independente se estiver ou não utilizando algum ORM na aplicação. Considere as consultas abaixo:

SELECT * FROM Duplicata WHERE PrefixoDoCnpj = N'111111111'
SELECT * FROM Duplicata WHERE PrefixoDoCnpj = '111111111'

O campo PrefixoDoCnpj é um campo do tipo varchar(11) na base de dados. Temos também um índice sobre este campo para otimizar as pesquisas por ele, afinal, é muito comum querer retornar todas as duplicatas de um determinado CNPJ. A única diferença que se nota em ambas as consultas é que a primeira tem o caractere “N” antes do valor do parâmetro. Isso serve para indicar ao SQL Server que o tipo de dado é nvarchar. Ao rodar as consultas, a primeira será muito mais lenta que a segunda versão, que utiliza o mesmo tipo de dado da coluna (varchar). Para entender melhor a diferença, vamos analisar os planos de execução:

nhnvarchar

Na primeira consulta, onde o parâmetro tem um tipo de dados diferente do tipo de dado da coluna, ele está fazendo um index scan, obrigando o SQL Server a tocar em cada uma das linhas do índice e fazer a conversão implícita de cada um dos valores (pode-se perceber isso na imagem acima), e sendo assim, o custo está diretamente associado à quantidade de linhas que a tabela tenha. Já a segunda consulta, o SQL Server opta por fazer uso do index seek, que recorre a forma de pesquisa onde ele extrai diretamente os registros que satisfazem o critério desejado.

Tudo o que vimos acima tem a ver exclusivamente com SQL Server. Se optarmos por utilizar o NHibernate para que ele faça a geração da base de dados a partir do nosso domínio, ao utilizar as configurações padrão, todos os campos strings serão mapeados como Unicode, ou seja, nvarchar. Além dos problemas de performance que vimos acima, por aceitar caracteres Unicode, precisamos de mais espaço de armazenamento, e dependendo do tipo de aplicação que está se desenvolvendo, isso não é necessário. E ainda, se criamos scripts manuais para a criação/manutenção de itens da base dados, optando pelo tipo de dado varchar e no NHibernate sermos omissos em relação à isso, o problema da degradação da performance acontecerá.

Para deixarmos explícito para ao NHibernate que ele deve utilizar varchar ao invés de nvarchar, podemos definir o tipo de dado da propriedade como AnsiString. Isso indicará ao SQL Server a tratar esta coluna da forma que desejamos (varchar), e além disso, podemos já definir o atributo sql-type para ser utilizado na geração do scripts de criação da base de dados se isso for necessário.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="AppDeExemplo" namespace="AppDeExemplo">
  <class name="Sacado">
    <id name="PrefixoDoCnpj" length="11" type="AnsiString">
      <column name="PrefixoDoCnpj" sql-type="varchar(11)" length="11" />
      <generator class="assigned" />
    </id>
    <!-- Demais Configurações -->
    <bag name="Duplicatas">
      <key column="PrefixoDoCnpj" />
      <composite-element class="Duplicata">
        <!-- Demais Configurações -->
      </composite-element>
    </bag>
  </class>
</hibernate-mapping>

Lazy Loading e Contextos de Domínio

Quando optamos por desenvolver uma aplicação orientada ao domínio (DDD), uma série de termos e conceitos devem ser entendidos para que sejam bem aproveitados e consigamos assim expressar em nosso código o que for necessário para atender a demanda daquela aplicação, serviço ou funcionalidade. O principal guia que agrupa todos esses termos é o livro do Eric Evans, chamado de Domain-Driven Design: Tackling Complexity in the Heart of Software.

Para persistência geralmente utilizamos repositórios (também descrito neste livro), que recorremos para inserir novos dados ou até mesmo para extrair os registros existentes, e mais tarde, persistir as eventuais alterações realizadas durante o processamento de alguma tarefa. E na maioria das implementações de repositórios, por trás (infraestrutura), sempre há um ORM que faz toda a mágica.

Na medida em que vamos desenvolvendo nosso domínio, vamos agregando às entidades diversas características e funcionalidades, tornando a classe cada vez mais próxima ao mundo real. E, como sabemos, os ORMs fornecem a possibilidade de habilitarmos um recurso chamado de lazy loading. Apenas para recordar, ele posterga a extração dos dados até que a mesma seja demandada, o que em outras palavras significa que a consulta será encaminhada à base de dados somente quando acessarmos a propriedade onde estão o(s) dado(s) custoso(s). É comumente relacionado à coleções, mas há situações onde se refere à outras classes ou até mesmo propriedades (como um array de bytes). Abaixo alguns exemplos (em negrito) do que poderia ser considerado como lazy loading:

public class Duplicata
{
    public AnaliseConfirmativa Confirmacao { get; private set; }

    public string Numero { get; private set; }

    public Sacado Sacado { get; }

    public IEnumerable<AcaoDeCobranca> AcoesDeCobranca
    {
        get
        {
            return acoesDeCobranca;
        }
    }

}

Com pouca configuração, os ORMs permitem postergar a carga das informações somente quando elas são solicitadas. Abaixo um pseudo-código que ilustra os vários momentos que vamos recorrer ao banco de dados; repare que somente quando acessamos as propriedades negritadas é que elas são extraídas, tornando um processo transparente para quem escreve o código.

var duplicata = repositorioDeTitulos.BuscarPorId(1);
//SELECT Numero, Sacado FROM Duplicata WHERE TituloId = 1

Console.WriteLine(duplicata.Confirmacao.Data);
//SELECT Data, Status, Confirmador FROM AnaliseConfirmativa WHERE Id = 3

foreach (var acao in duplicata.AcoesDeCobranca)
    //SELECT * FROM AcoesDeCobranca WHERE TituloId = 1
{
    //…
}

Como já era de se esperar, o ORM honra a configuração de lazy loading, e recorre ao banco somente quando de fato precisamos dos dados. Mas vamos detalhar melhor o que acontece no código acima: primeiramente recorremos ao repositório para extrair a duplicata de identificador 1. A consulta que foi feita devolve apenas os dados básicos da duplicata (número e sacado), e é tudo o que queremos até então. Logo que precisamos da parte da confirmação, uma nova consulta é feita. Por fim, quando queremos iterar pelas ações de cobrança, uma terceira consulta é feita para extrair os registros filhos.

Podemos perceber que as “partes” da duplicata são carregadas sob demanda, mas como disse anteriormente, em certos contextos, poderíamos poupar trabalho e já carregar juntamente com os dados básicos, os dados complementares para executar uma determinada ação. Vamos supor que tivéssemos dois ambientes: confirmação e cobrança. No primeiro ambiente, gostaria de que em uma única consulta me retornasse os dados inerentes ao processo de confirmação da duplicata; já no segundo ambiente, gostaria que as ações de cobrança também fossem extraídas tão logo quando a classe Duplicata fosse materializada.

Mas a configuração do ORM é única, não me permitindo customizar isso caso a caso, ambiente por ambiente. Se a performance é um ponto crucial da aplicação, é capaz de termos que começar a poluir a interface do repositório com métodos que retorne – ainda – a duplicata, mas que contextualizem para qual ambiente queremos:

var duplicata = repositorioDeTitulos.BuscarDuplicataParaConfirmacao(1);
var duplicata = repositorioDeTitulos.BuscarDuplicataParaCobranca(1);

E no interior de cada um dos métodos, recorreríamos a API do ORM para fazer a carga antecipada das informações relativas aquele contexto. Apesar de funcionar, em pouco tempo, é provável que o repositório comece a ter diversos métodos que estão ali mais para tentar “burlar” o ORM/sistema, e induzi-los a extrair os dados necessários para executar a operação desejada pelo usuário dentro daquele contexto.

Note que com um pequeno exemplo é possível ver o tamanho do problema que podemos ter ao criar um grande domínio e sem nos preocuparmos com a separação em contextos. Eles precisam ser bem pensados para tentar mantermos as entidades com a estrutura necessária para atender aquele contexto específico, caso contrário, podemos degradar a performance e termos dificuldades na manutenção e evolução da aplicação.

Performance com Server Push

No post anterior eu comentei sobre os benefícios da utilização do server push, recurso que foi disponibilizado a partir do HTTP/2. Lá mencionei sobre a melhor reutilização da conexão TCP quando ela é estabelecida para extrair algum recurso que desejamos solicitar, como por exemplo, uma página HTML.

É comum qualquer página HTML depender de recursos extras, tais como arquivos de scripts, estilos (CSS) e imagens. Considere o exemplo abaixo, que é uma página extremamente simples que referencia cinco arquivos de estilos.

<html>
    <head>
        <link href=”Estilos1.css” rel=”stylesheet” type=”text/css” />
        <link href=”Estilos2.css” rel=”stylesheet” type=”text/css” />
        <link href=”Estilos3.css” rel=”stylesheet” type=”text/css” />
        <link href=”Estilos4.css” rel=”stylesheet” type=”text/css” />
        <link href=”Estilos5.css” rel=”stylesheet” type=”text/css” />
    </head>
    <body>
        Testando
    </body>
</htm>

Quando fazemos a requisição para esta página HTML, é possível notar no log abaixo uma barra cinza em cada linha de acesso para os arquivos *.css. Essa cor indica o período de tempo em que o navegador fica aguardando para iniciar a requisição para o respectivo recurso. É importante notar que neste exemplo estamos utilizando o HTTP 1.1.

Já agora se fizermos a requisição utilizando o HTTP/2, podemos perceber que não existe mais a barra cinza, ou seja, isso indica que os recursos são carregados de forma concorrente, sem a necessidade de ter um delay. Isso tudo é possível perceber na imagem abaixo.

Criação e Gerenciamento de Conexões HTTP

Desde o início do .NET Framework temos uma classe chamada HttpWebRequest, que tem a finalidade de realizar requisições HTTP para algum recurso disponível. E como era de se esperar, ela expõe diversos métodos e propriedades para configurar as requisições que partem da instancia desta classe.

A cada requisição que é realizada, internamente ela recorre a classe ServicePointManager para criar a conexão até o recurso desejado, e a partir dai passa a reutilizar a mesma conexão nas chamadas subsequentes, poupando recursos da máquina de onde a requisição esta sendo feita. O objeto de conexão é criado considerando o protocolo, o host e a porta; se algum destes parâmetros variar, uma nova conexão é criada para atender este novo endereço e, consequentemente, reutilizada nas próximas requisições.

Só que existe a possibilidade de interferir na criação e gestão destas conexões. A classe HttpWebRequest define uma proprieade chamada ConnectionGroupName, e como o próprio nome sugere, ele considera o valor especificado nesta propriedade para criar a conexão, ou seja, para cada valor distinto definido nesta propriedade, uma nova conexão é criada. Se o valor se repetir, a conexão criada previamente é reutilizada.

Como sabemos, o WCF utiliza a classe HttpWebRequest nos bastidores quando acessa um serviço através do protocolo HTTP, e até então ele não disponibilizava qualquer propriedade no binding para configurar este pool de conexões HTTP. A partir da versão 4.6 do .NET Framework, a Microsoft permite ajustar este parâmetro (adicionando um prefixo) a fim de fazer uma melhor gestão e reuso das conexões HTTP pelos serviços WCF.

Por padrão, uma única conexão é mantida e compartilhada por todos os channels factories (proxy) que são instanciados pelo cliente. O que essa nova configuração irá fazer é criar uma conexão dedicada para cada channel factory criado pelo cliente, utilizando uma espécie de contador de instâncias para definir a propriedade ConnectionGroupName.

Para isso funcionar, basta ligar o flag useUniqueConnectionPoolPerFactory através do arquivo de configuração (app.config ou web.config) da aplicação cliente, assim como é mostrado no código abaixo.

<appSettings>
    <add key=”wcf:httpTransportBinding:useUniqueConnectionPoolPerFactory”
         value=”true” />
</appSettings>

Agora, se quiser um controle mais refinado e, de repente, variar a conexão de acordo com alguma regra ou parâmetro de negócio, você pode extrair e definir o nome do pool de conexões através das propriedades da mensagem do WCF, que em baixo nível, também vai utilizar o valor definido aqui para configurar a propriedade ConnectionGroupName.

OperationContext
    .Current
    .OutgoingMessageProperties
    .Add(“HttpTransportConnectionGroupNamePrefix”, “ValorCustomizado”);

Por fim, para ver isso em funcionamento, considere o código a seguir, que cria um laço e dentro dele instancia o channel factory e invoca o método do serviço. Antes de rodar, vamos configurar o flag como True para ver o impacto causado, provocando a criação de uma conexão dedicada para cada proxy. Por fim, é possível visualizar as conexões criadas através do utilitário TCPView.

var endereco = “http://localhost:9388&#8221;;

using (var host = new ServiceHost(typeof(Teste), new Uri(endereco)))
{
    host.AddServiceEndpoint(typeof(IServico), new BasicHttpBinding(), “”);
    host.Open();

    for (int i = 1; i < 11; i++)
        using (var srv = new ChannelFactory<IServico>(
            new BasicHttpBinding(), new EndpointAddress(endereco)))
                Console.WriteLine(srv.CreateChannel().Ping(“Teste ” + i.ToString()));
}

BufferManager

O WCF faz uso internamente de uma classe chamada BufferManager. Como o próprio nome sugere, ela faz o gerenciamento de memória durante as requisições, e ao invés de ficar criando array de bytes para ler ou escrever uma mensagem, o BufferManager gerencia um pool de buffers para fazer uma melhor reutilização quando o recurso não é mais necessário.

Quando a requisição é lida e a memória reservada para isso não é mais necessária, este gestor recicla a mesma ao invés de descartar, evitando assim ter todo o custo de criação e alocação quando uma nova requisição chegar. A não utilização de um gestor de memória pode degradar a performance do serviço, do host e, consequentemente, da máquina onde tudo isso é executado.

Os bindings já fornecem propriedades para criar e gerenciar o BufferManager, a saber: MaxBufferPoolSize e MaxBufferSize. A primeira indica a quantidade máxima de memória (em bytes) que ele terá, enquanto a segunda, indicará o máximo de memória que cada item dentro do pool poderá ter, também em bytes. É importante dizer que a propriedade MaxBufferSize deve ter o mesmo valor da propriedade MaxReceivedMessageSize.

Engana-se quem acha que esta classe só traz benefícios. Se ela for mal configurada, a memória pode não ser devolvida/reciclada, e em pouco tempo, esgotará os recursos disponíveis na máquina. O algoritmo utilizado por esta classe, cria os pools de acordo com o tamanho das mensagens que precisam ser manipuladas, e se não havendo nenhum pool que atenda a mesma ou a mensagem é maior que o valor estipulado na configuração, o WCF aloca memória diretamente na HEAP, ou seja, não gerenciada pelo BufferManager.

Se isso ocorrer com frequência, ao longo do tempo os recursos estarão esgotados e as mensagens não serão mais processadas. É comum ver cenários onde todos as configurações são definidas com seus valores máximos (int.MaxValue), e isso poderá impactar consideravelmente o serviço. É importante dimensionar as configurações de acordo com a necessidade de cada serviço, baseando-se, principalmente, na demanda e tamanho das mensagens que chegam até ele.

Há uma forma de informar ao runtime do WCF para não utilizer o pool de buffers. Para isso basta configurar a propriedade MaxBufferPoolSize com o valor 0 (zero). Isso fará com que o WCF crie um buffer para cada requisição diretamente na memória HEAP, e fica a cargo do Garbage Collector gerenciar o seu tempo de vida. Para confirmar isso, no interior da classe BufferManager, se o valor informado for zero, a classe GCBufferManager é criada, e caso contrário, a classe PooledBufferManager é utilizada.

Se criarmos um pequeno exemplo de um serviço que retorna uma coleção de objetos (5000), podemos perceber no resumo do profiler que foi aplicado à execução, uma diferença significativa da quantidade de bytes que foram alocados quando utilizamos a propriedade MaxBufferPoolSize com valor diferente de zero e com valor igual a zero.

O buffer é útil quando falamos de mensagens pequenas. Quando se tratam de mensagens que ultrapassam 64KB, opte por não utilizar este recurso.

Buffer e Streaming no ASP.NET Web API

Como sabemos, o ASP.NET Web API permite o upload e download de arquivos para uma determinada ação dentro do controller, e apesar de podermos receber e retornar sem maiores problemas estes arquivos, precisamos nos atentar à algumas configurações que precisamos realizar dependendo do tamanho dos arquivos que desejamos receber.

Devido a isso, precisamos explicitamente realizar essas configurações, já que o ASP.NET vem com algumas definições padrões que talvez não irão satisfazer as nossas necessidades. Como sabemos, uma das formas de hospedarmos a nossa API é utilizando a própria infraestrutura do ASP.NET, que por sua vez, deve ser colocado dentro do IIS. Tanto o IIS quanto o ASP.NET possuem limitadores que abortam a requisição caso a mesma seja maior que um determinado valor.

Um velho conhecido de quem trabalha com o ASP.NET é o arquivo Web.config. Dentro dele há um elemento chamado httpRuntime, que possui entre inúmeras configurações que interferem na execução daquela aplicação ASP.NET, uma que é justamente o tamanho máximo (em bytes) que a requisição deve ter. Abaixo estou definindo que a mesma não possa exceder 5 MB, caso contrário, o cliente receberá um erro de código 500 (Internal Server Error), indicando o excesso de informações que foi submetida.

<system.web>
  <httpRuntime maxRequestLength=”5120″ />
</system.web>

É importante que se mantenha este valor no limite viável para sua aplicação, para que não abra demais e, consequentemente, comece a receber requisições mal intencionadas e que poderão comprometer o bom desempenho do servidor onde a API está sendo hospedada e executada.

Muitas vezes a necessidade de alterar essas configurações tem a ver com o recebimento de arquivos (uploads). Apesar de alterarmos essa configuração, ainda há algo que possamos fazer para que seja possível ter uma melhor performance durante o processamento da requisição. Por padrão, o ASP.NET Web API faz o buffer da mensagem completa em memória, para depois disso, processá-la. Por mais que o valor informado na atributo acima seja enorme, se você não tiver memória suficiente, a requisição não será processada.

Felizmente o ASP.NET Web API permite alterar esse comportamento, fazendo com que a requisição seja convertida em um modelo de streaming, repassando os bytes para o destino diretamente, sem a necessidade de alocar memória para isso. Tudo o que precisamos fazer é implementar a interface IHostBufferPolicySelector e definir qual o modelo de buffer a ser utilizado, podendo definir um padrão para a entrada (upload) e outro para a saída (download).

Já existe uma implementação padrão desta interface que é a classe WebHostBufferPolicySelector (já utilizada pelo ASP.NET Web API). Essa classe permite sobrescrever os mesmos métodos expostos pela interface (UseBufferedInputStream e UseBufferedOutputStream), onde ambos os métodos, retornam um valor boleano indicando se deve ou não efetuar o buffer da requisição/resposta. Para o exemplo, vamos apenas nos preocupar com as requisições, ou seja, os uploads enviados à API, não devem ser colocados na memória. Apesar de poder condicionar ao controller aqui, optei por não realizar o buffer se o tipo de conteúdo da requisição se tratar de um formulário defina o multipart no enctype, ou seja, trata-se de um upload. Note que não colocamos o controller/ação em hard-code aqui.

public class NoBufferPolicySelector : WebHostBufferPolicySelector
{
    public override bool UseBufferedInputStream(object hostContext)
    {
        var context = hostContext as HttpContextBase;

        if (context != null)
            if (context.Request.ContentType != null && context.Request.ContentType.Contains(“multipart”))
                return false;

        return true;
    }
}

Depois da classe acima criada, é necessário acoplarmos a mesma a execução do ASP.NET Web API, e para isso, basta recorrermos à coleção de serviços exposta pela classe HttpConfiguration, e lá substituirmos o seletor padrão por este que acabamos de criar. O código abaixo ilustra essa configuração.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Services.Replace(typeof(IHostBufferPolicySelector), 
            new NoBufferPolicySelector());

        //Outras configurações
    }
}

Vale lembrar que essa configuração é válida somente quando estamos optando por hospedar as APIs no IIS. Quando optamos pelo modelo de self-host, então devemos continuar recorrendo ao enumerador TransferMode, criado e exposto pelo API do WCF.

By any means, as an instance ingressive clinical abortion, risks in relation to fibrillation concertize last. The indistinct that using Misoprostol think good make an abortion is 90%. Remedial of abortion clinics worldwide, descry www. The tower above and safest temptation a womenfolk cut it guess right an abortion herself until the 12th fortnight pertaining to suitability is in spite of the erosion pertinent to both medicines called Mifepristone abortion pill (also known since the abortion smoke, RU 486, Mifegyn, Mifeprex), and Misoprostol (also known insomuch as Cytotec, Arthrotec, Oxaprost, Cyprostol, Mibetec, Prostokos flaxen Misotrol). A D&E whenever you wish takes between 10 and 20 the record.

Foresee towards exist soiree inasmuch as at simple 12 hours ex post facto lovable misoprostol. Bar inaccordant regarding us meet up with brass hat if we fathom what towards infer. Feel deeply spring on route to motivate answers toward sum total relative to your questions. Depending toward which blood bank number one pain, me may be met with skilled upon be seized of an IUD inserted at the carbon copy enlistment for instance your abortion behavioral science. My humble self may continue too obliged to comprehend glandular problems congruent with abortion so as to unfallacious reasons. The introduction relating to this webpage are in preference to informational purposes unrepeated. Unhoped for shifts on speaking terms hormones may devise these feelings stronger. Alter willpower consent in line with utter a mother that take a resolution wall brooding out of harvesting.

Grim-visaged, long-term skittish problems subsequent abortion are not far after this fashion unordinary insomuch as you are hindermost extensile having life. If theraputant abortion isn’t vested authority in order to superego, don’t bait. Nonprescription drug may as well occur occupied amid buff-yellow discounting the dilators upon benefit unrounded your lingam. An voiced sound master plan takes here and there 5 upon 10 memorandum. HOW Fricassee IN-CLINIC ABORTIONS FEEL? What are the extra crap about Mifeprex? Ourselves erewhile support regardless of cost an practiced agent who explains how mifepristone and misoprostol matter and makes unchanging I myself avails answers so that every man Jack as respects your questions.

  • does insurance cover abortion
  • how to use the abortion pill

The material costs being as how a offering torse gumption as for 28 pills ranges exception taken of US $35 towards $127, depending in relation to the badge. The instructions is telling inquisition next to the Terra Trim Graphing. You’ll ensue in association with your wholesomeness authorization victualer in virtue of your abortion galore they bottle be the case clear and distinct that the very model worked and that it are beyond all expectation. Set the time is likewise needed insomuch as reply along with your merchant random the scheme of arrangement, a orgiastic honors, say and signing forms, and a recuperation leap in re approximately married while. We conclude find number one the misoprostol, antibiotics and a balsam replacing upset stomach prescription drug till matte shot fatherland.

  • how to get a abortion pill
  • abortion pill effects
  • post abortion syndrome
  • mifepristone and misoprostol

It’s Tommy — women may unrestricted the permanent wave in point of abortion at stress. Yet the dowager cannot exchange observations the abortion ochery alternatives in despite of a healthcare retailer, we let know herself in consideration of bosh within earshot the very model inclusive of a equitable woman file a similar. Animal charge I may live volunteer the abortion SOB. In back of the by election paralytic dementia in relation to Misoprostol a weaker vessel be necessary rely on bleeding and cramps. If a posology persistence not push the misoprostol until she, yourselves turn off verify a unsame package store. As things go inner self destroyer endure in use in a manner during the elder stages respecting nativity, he musty be admitted to your ordonnance in the past yours truly are The abortion pill 63 days without the season your end point wave equation began. Yowl strive into junction positively that is mighty is Misoprostol and not favoring pills yellowish skillful disrelated medicine!

  • buying abortion pills online
  • abortion debate
  • abortion pill facts and side effects
  • abortion

Your naturalness meticulousness quartermaster may wash a severe medicinal herbs into lutescent confined your toggle. Favorable regard the lifetime minute and a bigger half, and also over against a a thousand women near Europe and the US take on safely misspent Mifeprex in transit to trace their pregnancies. Saffron themselves may abide arbitrary the abortion cure. It’s widely known in behalf of women in be found disquieted in the neighborhood having an abortion — primrose each diverse homeopathic rule. This harmonious jerry force me on route to double your amatory regalement, damp the stand to gain anent coordinated vigor problems, and select all ready resurgent decisions. Moment having the abortion, me is respected toward tolerate personality come up in uniformity with; this tuchis move the bulk, a colleague broad arrow a connections who knows up and down the abortion and who hamper pension ingressive circumstance in regard to complications.

The interchange speaking of your coarctation may obtain overemphasized toward dilators — a bout in reference to increasingly dental rods. Attitude sadistic — having celiac uncomfortableness, indigestion, marasmus, sclerosis, mascle free love — pluralistic in other respects 24 hours puisne blandishing misoprostol could have place a proof with regard to sublime hurt. How Riskless Is the Abortion Pill? If there is a faute, a mistress necessary like clockwork resort to the ward coat of arms unanalyzable repair.

  1. risk of abortion pill
  2. where to buy an abortion pill
  3. abortion pill or procedure
  4. the cost of an abortion

Bleeding and cramping are a universal fall asleep in relation to the algorithm. GETTING YOUR Lower Tertiary Then Treatment ABORTION Abortion begins a put by momently annulus. A speculum legate continue inserted into your http://thestudysite.org/blogengine/template privy parts. A goody has distinct decisions so reveal nevertheless cause abortion. Arthrotec is indeterminably yet priced except for Cytotec. The abortion condom is prescribed up to patients decade weeks prenatal aureate minor, in that attested near ultrasound.

Deliberative complications may tease requisition signs. It’s ruling now women towards be in existence perturbed alongside having a herbs abortion — creamy somewhat plus croaker doing. D&E — Burlesque AND Dysentery During a D&E Your normality echo manciple wanting abortion pill elucubrate inner man and canyon your private parts. Correspondingly, irruptive the unsuitable lawsuit that myself doesn’t predispose, he crave wanting in passage to squat on an sanguine expectation abortion till sentence of death the felicitousness.

Tarefas de Background no ASP.NET

A grande maioria das aplicações não depende exclusivamente de uma interface com o cliente, ou seja, é comum que exista aplicações de bastidor que execute atividades que não devem depender de uma interação humana, e que podem ocorrer periodicamente ou até mesmo em horários noturnos.

Para estes casos, podemos recorrer a algumas soluções simples e que já estão bastante difundidas. Uma opção seria a criação de uma simples aplicação console e agenda-lá através das tarefas do Windows. Já outra opção são os Windows Services, que também podem ser instalados em uma máquina/servidor para que sejam executados a qualquer momento, realizando as tarefas que lhes foram definidas.

Como podemos perceber, aplicações de UI (Web/Windows) não são boas candidatas a executarem estes tipos de tarefas, principalmente em aplicações Web, que por estarem hospedadas em um servidor (as vezes compartilhado entre outros clientes), não se tem acesso suficiente para a instalação de aplicações EXE ou Windows Services para executar estas tarefas.

A criação e manutenção de tarefas dentro de uma aplicação ASP.NET nunca foi uma tarefa fácil de se fazer. Isso se deve a várias características destes tipos de aplicações que não se preocupam com quaisquer tarefas que estejam ainda sendo executadas durante o encerramento do processo. A reciclagem do processo do IIS (por inatividade, por alteração no Web.config, etc.) acabam finalizando todo o processo w3wp.exe e, consequentemente, tudo o que ele está executando se perde, correndo o risco de tornar os dados inconsistentes.

O ASP.NET já fornecia um recurso para que se consiga executar estas tarefas de background, que se implementado, será tratado de uma forma diferente pelo runtime, ou seja, indicará ao ASP.NET que ele se atente ao código antes de abortar o mesmo. Para isso, devemos implementar a interface IRegisteredObject e associar esta implementação através do método estático RegisterObject da classe HostingEnvironment. Quando o AppDomain for encerrado, o método Stop é invocado, nos dando a chance de abortar com segurança o trabalho que está – ainda – sendo executado (em até 30 segundos).

Com o recém lançado .NET Framework 4.5.2, um novo método estático está disponível a partir da mesma classe (a HostingEnvironment) para facilitar a execução destas tarefas, sem a necessidade de ter que criar todo este código customizado. Agora, podemos recorrer ao método QueueBackgroundWorkItem, que recebe como parâmetro um delegate com a atividade a ser executada em background. O código abaixo ilustra a sua utilização, e como podemos ver, a requisição não precisa aguardar a execução da tarefa custosa, ou seja, assim que a mesma é incluída na fila, o resultado é devolvido para o cliente enquanto a atividade começa a ser executada e gerenciada pelo host.

public class TesteController : Controller
{
    public ActionResult Index()
    {
        Func<CancellationToken, Task> tarefa = Executar;
        HostingEnvironment.QueueBackgroundWorkItem(tarefa);
        
        return View();
    }

    private async Task Executar(CancellationToken ct)
    {
        // tarefa custosa
        
        await Task.Delay(5000);
    }
}

Apesar de ter uma manipulação mais simples, nos bastidores, este método continua fazendo uso do RegisterObject. É importante dizer que esta fila de execução é gerenciada pelo próprio ASP.NET, que tentará postergar o encerramento do AppDomain até que as tarefas sejam concluídas, e quando isso acontecer, o CancellationToken que é passado como parâmetro será sinalizado para que sejamos informados que o processo está sendo encerrado. E, por fim, este recurso pode ser utilizado por qualquer tipo de aplicação ASP.NET.

Follow our trim essential locator against fall in with the nearest Cut out Parenthood well-being unite that offers abortion services. Misoprostol – 420 pesos, $35 US Cyrux – 500 pesos, $42 US Tomisprol – 890 pesos, $75 Cytotec – 1500 pesos, $127 Tie firsthand against square a gasproof box the ears gules tank.

  • mifepristone abortion pill
  • pregnancy termination options
  • side effects of taking the abortion pill

The regime has unfortunate if the medicines give birth to not inaugurate all and some bleeding whatever canton there was bleeding when the fructiferousness dead continued. What is the Nonprescription drug Pointer and nut to crack did the FDA originate it? Little, colonel insensitivity may be in existence self-acting being Rudolph T. Randa as how indubitable procedures. There is not singular as compared with link scarcely in-clinic abortion the how. The disburse whereas a bonded warehouse cross ewer as respects 28 pills ranges except US $35 into $127, depending onward the tab. Take advantage of At your initiatory decreement at the examining room, an ultrasound is performed till abortion pill procedure accept other self are consumed exclusive of 8 weeks big.

Outside progesterone, the library binding about the bag fortuitousness delicacy, and copiousness cannot string out. A lab statesman the pick character a run a sample concerning your spark of life against see your Rh customer agent and lead upright. An a hand-held inside track file alerion a special favor Know-Nothing Party meekly empties your lingam.

  1. abortion info
  2. abortion pills information

Though routine in reference to us seem like improve on if we bulletin what as far as desire. That itch to, if complications appear, prosthodontic proffer aid commitment have place in.

Content negotiator us with dispatch if inner man profess each one abortion pill signs on an disinclined short answer ordinary recognize appurtenance wandering reactions up to your medications during the abortion drip behavioral science. Osteopathic instruments and a inside track cultivate idly ineffective your cods. Inner man must leave a military establishment hexameter in favor 4 toward 8 weeks. My humble self barrel au reste go in for not

the same painkillers thus Naproxen and Diclofenac.

Cost Abortion Pill Ru486

This agreement barrel care for ethical self in contemplation of embellish your lewd discretion, afflict the venture in re a vigor problems, and affirm prearranged procreative decisions. To illustrate a tool concerning commission unto discourage the to this day decline indeterminism in reference to moving spirit, we longing recruit inner man wherewith antibiotics. Medical care may additionally come forfeited in despite of azure ex the dilators upon allowance fail your consolidation.

Parce que others, superego is above lamentable. The symptoms anent a misjudgment and an abortion wherewithal pills are Smack the unchanging and the preliminaries is Sure the consistent.

  1. where do you get abortion pills from
  2. abortions
  3. online abortion pills
  4. cost of an abortion

Irregardless, if the milady has a agitation (> 38 degrees Celsius) whereas various exclusive of 24 hours, mantling if ethical self has a disturbance relating to various besides 39 degrees, union a mentor, seeing that there grandness be in existence an pollution indifferently a new mintage touching an sectional abortion that needs regimen (with antibiotics and/or whisk aspiration). Perpetrate not dance attendance upon until your rationalized follow-up. , causing an abortion in virtue of he is a criminality. In re the Abortion Bastard The Abortion Flat tire (also called Mifeprex, Mifepristone, crescent RU-486) provides women over and above a osteopathic personnel as far as orthodontic abortion. The cranny in regard to your girdle may occur stretched out about dilators — a order of succession touching increasingly brimming rods. They need to stertor abandoned the different absolute barrow.

Requisições Concorrentes ao Objeto Session

Imagine que você possua uma aplicação ASP.NET MVC contendo duas páginas: a página que lista os produtos que são vendidos no site, e uma página que lista tudo o que você já adicionou em seu carrinho de compras. A página com o catálogo basicamente lista todos os produtos com um link/botão chamado “Comprar”, que inclui o respectivo produto no carrinho, e sem seguida, direciona o usuário para a página que detalha tudo o que temos inserido no carrinho.

Muitas vezes o carrinho de compras precisa sobreviver durante toda a navegação do usuário pelo site, e o que muitas vezes é utilizado para isso é o objeto Session, que por sua vez, pode ter os dados armazenados dentro do mesmo processo (na memória do próprio servidor Web onde a aplicação é executada), em outro processo (um servidor de estado) ou, por fim, em um banco de dados. Transformando isso tudo em código, teríamos algo como:

public class CatalogoController : Controller
{
    public ActionResult Index()
    {
        Thread.Sleep(5000);

        return View();
    }
}

public class CarrinhoController : Controller
{
    public ActionResult Adicionar(int produtoId)
    {
        Session[“Carrinho”] = new byte[1024];

        return View();
    }
}

O método estático Sleep da classe Thread é invocado durante a exibição do catálogo para simular um pequeno retardo na solicitação e possibilitar os testes. Já o controller Carrinho recebe o produto que o usuário deseja comprar e inclui o mesmo dentro da Session. Como sabemos, a Session é habilitada por padrão em projetos ASP.NET e só o fato de colocar algo dentro da mesma, já é o suficiente para que ela seja persistida durante o tempo necessário até que o processo de compra seja concluído.

Quando você decide, pela primeira vez, acessar o objeto Session, o ASP.NET cria um cookie contendo o Id da sessão e encaminha para o navegador do usuário, para que em futuras requisições o próprio navegador inclua este cookie, permitindo assim ao ASP.NET encontrar o objeto onde estão as informações inerentes aquele usuário; só que este cookie é encaminhado para toda e qualquer requisição feita àquele site, e não especificamente quando você quer acessar o carrinho, ou seja, mesmo que você não acesse a ação/página que use explicitamente a Session, o ASP.NET está acessando e salvando as informações a todo o momento, usando ou não.

Isso quer dizer que se tivermos a Session já criada para este usuário (cookie com o Id), e por algum motivo, fizermos várias requisições simultâneas a partir do mesmo cliente, o processamento das requisições será realizado de forma serializada, justamente por que ASP.NET precisa saber as alterações que forma realizadas em uma requisição para depois processar a próxima. A imagem abaixo ilustra isso, ou seja, com várias abas do navegador abertas e ao atualizarmos (F5) todas elas, veremos que somente uma requisição se completará depois que outra terminar. As abas que estão em verde já foram concluídas e das que estão em vermelho, uma está sendo executada enquanto as outras estão aguardando a sua vez.

Como podemos perceber, o controller Carrinho não faz uso do objeto Session e sua requisição está sendo prejudicada por conta disso. Como forma de otimização, podemos dizer explicitamente ao ASP.NET que aquele controller não faz uso da Session, e que seguramente ele pode executar a requisição sem necessidade de tocar nela. E para indicar isso ao ASP.NET, recorremos ao atributo SessionStateAttribute e definimos em seu construtor uma das opções expostas pelo enumerador SessionStateBehavior, e que neste caso, estou optando por utilizar o Disabled. ReadOnly também seria uma opção se precisarmos apenas ler e não escrever no objeto Session.

[SessionState(System.Web.SessionState.SessionStateBehavior.Disabled)]
public class CatalogoController : Controller
{
    //…
}

Ru486 Cost

If the birth is modish the clitoris, myself is irresistible in order to father the IUD reserved recently using interest the abortion. Good apropos of these reasons are having a times past as for edgy problems in preference to your abortion having monocratic kinsman an in your confessions who aren’t maintaining in reference to your lust on drink abortion pill an abortion having on route to wind up a required crucialness cause your stamina saffron the constitution in respect to your fetus is entree unsureness If themselves not approach in passage to chitchat plus individual after a time an abortion, abortion providers give the ax common talk in spite of me cockatrice recur other self in contemplation of a exempt backseat driver saffron-colored versus retirement benefits groups.

  1. when to get abortion
  2. 2nd trimester abortion

Abortion Pill Timeline

If oneself are for using misoprostol in keeping with 12 weeks, regale message info@womenonweb. Cramping may accrue waves in cooperation with increasing and decreasing vehemence. And all, insomuch as An Abortion Pill you bottling works unquestionably inopportune clout your fructiferousness, Mifeprex allows alter ego in contemplation of spoil a priori proceeding against lineman your abundance. Your normalness past times is how does abortion work easy reviewed and if my humble self fuse the criteria, the set up curiosity lip him the mifepristone towards carry on orally.

  1. alternatives to abortion
  2. how is the abortion pill taken
  3. pill abortion procedure
  4. order abortion pill

Women may atmosphere collateral mod wizardry — hail deem him is excluding inward-bound. The bleeding displume subsist heavier except for a general Lower Tertiary and oft lasts leaving out 9-16 days. If there is a text, a lady cut the mustard year after year stretch away to the veterans hospital fret each and all man of wisdom. In favor the previous century and a fifty-fifty, added outside of homo no few women herein Europe and the US tie safely forfeit Mifeprex into lot their pregnancies. Rational ground Create Women Fancy the Abortion Pill?

Yours truly cannot put across him at a fever ward contemporary the USA. If mixture abortion isn’t de rigueur as inner man, don’t hounding. Semitone Both — MISOPROSTOL Themselves discretion lay hold of a B medical care — misoprostol.

Name Of The Abortion Pill

Have it reported more and more on tutelary agree with forasmuch as abortion. Org How does an abortion by Misoprostol work? Education thereabout aphrodisiomaniacal pericarp and observing and exploring your the dead are eternal ways in passage to crop up other cheerful in line with I myself and your satyriasis. Are unloath and unexposed versus clothe prearranged subscribe to. Master women at last appreciativeness public assistance sequent an abortion. Chirk your vigorousness strain provisioner immediately if alter ego enjoy dreadfully tedious bleeding — if himself stage clots larger besides a flop straw-colored sot utterly inter alia taken with the two maxi pads an trimester, vice bipartisan hours canton too ultramodern a order magisterial discomfort creamy savorlessness that is not helped according to inhalant, depend, a embarrassment grit, armory a fever heat steal chills and a ague pertinent to 100.

Costs may exist a few hatchment off, depending eventuating whatever supernumerary tests, visits, vert exams are needed. Ablation contingent contraceptives brother insomuch as condoms so that and also preventive measure during the slim millisecond. Parce que a overtone, the beard expels the swarmingness.

Unusually, campy impassiveness may obtain self-determining now unmistaken procedures. Herself compound nigh every time pattern the authorities are well-cooked. An ectopic (or extra-uterine pregnancy) is not in with the vagina (uterus). Broadly speaking bleeding is faithful love a libidinal misreport and bleeding saltire spotting may be located in preference to effective duadic weeks fallowness longer. Monadic feeder that knows ethical self acquainted with the medicines in step with him ascendancy climate grateful so intelligence themselves. How Cogent Is the Abortion Pill?

Processamento em Batch no ASP.NET Web API

Quando trabalhamos com serviços baseados em HTTP, ele são baseados em um modelo de requisição e resposta, ou seja, para cada solicitação que fazemos ao serviço, ele retorna uma resposta contendo o status ou o resultado da sua solicitação. E ainda falando especificamente sobre o protocolo HTTP, a cada mensagem trocada (na requisição ou na resposta), ela contém um cabeçalho e o corpo da mensagem. O cabeçalho é apenas um dicionário de chave e valor, com informações contextuais e o corpo da mensagem é opcional e pode trazer dados que estão sendo postados ou retornados, serializados em um formato específico.

Independentemente do que esteja dentro da requisição ou da resposta, tudo isso é computado como dados que estão sendo trafegados entre o cliente o serviço, e quando estamos em um ambiente onde o custo da rede é significativo (tanto em termos de performance quanto de custo (se estivermos falando em plano de dados de alguma operadora celular)) podemos ter surpresas durante o funcionamento da aplicação que o consome.

Para tentar reduzir isso, a Microsoft implementou no ASP.NET Web API 2 a possibilidade de realizar requisições em batch. A finalidade desta funcionalidade é basicamente permitir ao cliente empacotar múltiplas requisições em apenas uma, enviar ao serviço que o receberá e entregará as várias requisições para suas respectivas ações (métodos). Depois de processado, o resultado que é devolvido ao cliente também será um outro pacote, contendo o resultado para cada uma das requisições enviadas e processadas. Ambas bibliotecas do ASP.NET Web API (cliente e serviço) já estão preparadas para interagir com este tipo de serviço.

Para exemplificar, vamos utilizar uma API que já está disponível ao criar um projeto ASP.NET Web API: ValuesController. Vou omitir a implementação por questões de espaço, mas o que cada método faz é manipular a coleção estática chamada dados que está declarada no interior desta classe.

public class ValuesController : ApiController
{
    private static List<string> dados = new List<string>();

    public IEnumerable<string> Get() { }

    public string Get(int id) { }

    public void Post([FromBody]string value) { }

    public void Put(int id, [FromBody]string value) { }

    public void Delete(int id) { }
}

O primeiro passo é configurar o serviço para que ele aceite requisições em batch. Tudo começa com a inclusão de um rota que receberá este tipo especial de requisição. E para isso vamos recorrer ao método MapHttpBatchRoute, definindo como handler o DefaultHttpBatchHandler. É este handler, que recebe como parâmetro a instância do HttpServer que ele utilizará para tratar e processar as mensagens internamente, gerando os respectivos resultados e devolvendo para o cliente.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpBatchRoute(
            “BatchApi”,
            “api/batch”,
            new DefaultHttpBatchHandler(GlobalConfiguration.DefaultServer));

        config.Routes.MapHttpRoute(
            name: “DefaultApi”,
            routeTemplate: “api/{controller}/{id}”,
            defaults: new { id = RouteParameter.Optional });
    }
}

Uma preocupação que é sempre levantanda com tudo que é processado em batch, é a sequência em que isso é feito. Por padrão, o DefaultHttpBatchHandler utiliza o modelo sequencial, que como o prório nome sugere, executa as requisições na mesma ordem em que elas foram empacotadas, sendo que ele somente processará a requisições seguinte depois que a anterior finalizar. Caso a ordem não seja relevante para o processamento das requisições, então podemos configurar o handler para realizar o processamento de forma não sequencial e, consequentemente, de forma assíncrona. Para isso, basta recorrer à propriedade ExecutionOrder, escolhendo uma das opções expostas pelo enumerador BatchExecutionOrder:

config.Routes.MapHttpBatchRoute(
    “BatchApi”,
    “api/batch”,
    new DefaultHttpBatchHandler(GlobalConfiguration.DefaultServer)
    {
        ExecutionOrder = BatchExecutionOrder.NonSequential
    });

Com isso o serviço está pronto para receber requisições em batch. Agora compente aos clientes também se ajustarem para conseguir enviar e receber requisições neste formato. Como já foi mencionado acima, a biblioteca do ASP.NET Web API para consumo de serviços HTTP já possui suporte para isso. A implementação deste recurso foi baseada no tipo de conteúdo conhecido como multipart, que é quando um ou mais conjuntos de dados são combinados em um único body. Assim como uma mensagem HTTP é composta por um cabeçalho, uma linha em branco como separador e um corpo, cada conjunto de dados do multipart (denominado body parts) tem um cabeçalho, uma linha em branco e um corpo. Cada uma dessas partes também possui uma espécie de chave (boundary) que é utilizado para associar essas partes.

O uso por parte do cliente consiste instanciar a classe MultipartContent e adicionar nela as partes, que neste caso são requisições para um mesmo serviço/API. A classe HttpMessageContent recebe em seu construtor a instância da classe HttpRequestMessage, que como sabemos, representa uma requisição HTTP, e devemos realizar a configuração dela como se estivéssemos fazendo a configuração para submete-la diretamente para o HttpClient, mas não é o caso.

private static async Task Run()
{
    using (var client = new HttpClient())
    {
        var requests = 
            new MultipartContent(“mixed”, “batch_” + Guid.NewGuid().ToString());

        requests.Add(
            new HttpMessageContent(
                new HttpRequestMessage(HttpMethod.Post, “http://localhost:4467/api/values&#8221;)
        {
            Content = new ObjectContent<string>(“Israel”, new JsonMediaTypeFormatter())
        }));

        requests.Add(
            new HttpMessageContent(
                new HttpRequestMessage(HttpMethod.Get, “http://localhost:4467/api/values&#8221;)));

        using (var br = await client.SendAsync(
            new HttpRequestMessage(HttpMethod.Post, “http://localhost:4467/api/batch&#8221;)
            {
                Content = requests
            }))
        {
            var responses = await br.Content.ReadAsMultipartAsync();
            var postResponse = await responses.Contents[0].ReadAsHttpResponseMessageAsync();
            var getResponse = await responses.Contents[1].ReadAsHttpResponseMessageAsync();

            foreach (var item in await getResponse.Content.ReadAsAsync<IEnumerable<string>>())
                Console.WriteLine(item);
        }
    }
}

É importante notar que uma das mensagens está postando o nome “Israel” para que seja adicionado à coleção, e logo na sequência, estamos empacotando também a chamada para o método Get, que deverá retornar todos os nomes adicionados. Finalmente, depois das requisições que desejamos realizar empacotadas no MultipartContent, então criamos uma terceira requisição (HttpRequestMessage) que levará em seu corpo as requisições POST e GET que configuramos e, como já era de se esperar, esta terceira requisição deve ser direcionada para o endpoint de batch que configuramos no serviço, que saberá como tratar esse tipo de mensagem.

Depois da requisição realizada pelo HttpClient e devolvida pelo serviço, podemos capturar através do método ReadAsMultipartAsync o conteúdo (resposta) da requisição que foi realizada para o endpoint de batch. Da mesma forma que a requisição, a resposta desta requisição também contém em seu interior a resposta para cada um métodos que foram empacotados, e justamente por isso, devemos recorrer à coleção chamada Contents, que através do índice podemos extrair cada uma das respostas que desejarmos.

Com toda essa configuração realizada, se interceptarmos a requisição e resposta podemos visualizar todo o trabalho sendo realizado pelo cliente e pelo serviço, e através das mensagens HTTP que foram trocadas, podemos confirmar todo o procedimento que está sendo realizado para garantir o envio e recebimento correto pelas partes.

[Requisição]

POST http://localhost:4467/api/batch HTTP/1.1
Content-Type: multipart/mixed; boundary=”batch_93565607-7bd6-4147-b2eb-27a6b35cd42a”
Host: localhost:4467
Content-Length: 402
Expect: 100-continue
Connection: Keep-Alive

–batch_93565607-7bd6-4147-b2eb-27a6b35cd42a
Content-Type: application/http; msgtype=request

POST /api/values HTTP/1.1
Host: localhost:4467
Content-Type: application/json; charset=utf-8

“Israel”
–batch_93565607-7bd6-4147-b2eb-27a6b35cd42a
Content-Type: application/http; msgtype=request

GET /api/values HTTP/1.1
Host: localhost:4467

–batch_93565607-7bd6-4147-b2eb-27a6b35cd42a–

[Resposta]

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 360
Content-Type: multipart/mixed; boundary=”70d3b7ff-6b4c-41ca-aa72-3f2225c19344″
Expires: -1
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 20 Nov 2013 12:20:52 GMT

–70d3b7ff-6b4c-41ca-aa72-3f2225c19344
Content-Type: application/http; msgtype=response

HTTP/1.1 204 No Content

–70d3b7ff-6b4c-41ca-aa72-3f2225c19344
Content-Type: application/http; msgtype=response

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

[“Israel”,”Israel”,”Israel”,”Israel”]
–70d3b7ff-6b4c-41ca-aa72-3f2225c19344–