{"id":1845,"date":"2014-12-16T17:18:35","date_gmt":"2014-12-16T17:18:34","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1845"},"modified":"2025-06-13T23:52:04","modified_gmt":"2025-06-14T06:52:04","slug":"xdcr-aspnet-and-nancy","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/xdcr-aspnet-and-nancy\/","title":{"rendered":"XDCR com ASP.NET e Nancy"},"content":{"rendered":"<p>Voc\u00ea provavelmente conhece o novo Cross Data Center Replication (<a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/3.x\/admin\/XDCR\/xdcr-intro.html\">XDCR<\/a>) do Couchbase Server 2.0.  Sua utilidade mais \u00f3bvia \u00e9 permitir a replica\u00e7\u00e3o de dados de um cluster do Couchbase para outro.  No entanto, h\u00e1 mais casos de uso novos para o XDCR.  Um dos exemplos mais not\u00e1veis \u00e9 a integra\u00e7\u00e3o do Couchbase e do Elastic Search.<\/p>\n<p>A execu\u00e7\u00e3o do XDCR em um cluster que n\u00e3o seja do Couchbase \u00e9 poss\u00edvel porque o ponto de extremidade de comunica\u00e7\u00e3o \u00e9 implementado usando uma API RESTful simples.  Ao implementar alguns m\u00e9todos simples, voc\u00ea pode configurar seu pr\u00f3prio ponto de extremidade de replica\u00e7\u00e3o.  H\u00e1 v\u00e1rios motivos pelos quais voc\u00ea pode querer criar seu pr\u00f3prio endpoint XDCR.  Um exemplo simples \u00e9 receber notifica\u00e7\u00f5es de altera\u00e7\u00e3o.<\/p>\n<p>A configura\u00e7\u00e3o de um ponto de extremidade \u00e9 bastante simples e pode ser feita usando qualquer estrutura da Web adequada para a cria\u00e7\u00e3o de APIs RESTful.  No .NET, uma op\u00e7\u00e3o \u00e9 o ASP.NET MVC e a nova API da Web.  Embora seja uma boa op\u00e7\u00e3o, uma solu\u00e7\u00e3o mais simples seria usar o <a href=\"https:\/\/www.sinatrarb.com\">Sinatra<\/a> inspirado <a href=\"https:\/\/nancyfx.org\/\">Nancy<\/a>.<\/p>\n<p>O Nancy \u00e9 um microframework leve para a cria\u00e7\u00e3o de aplicativos baseados em HTTP com o .NET.  No caso mais b\u00e1sico, voc\u00ea cria um m\u00f3dulo que se estende a partir de <em>NancyModule<\/em> e criar uma rota e um manipulador.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace;\"><span style=\"color: #0600ff; font-weight: bold;\">p\u00fablico<\/span> <span style=\"color: #6666cc; font-weight: bold;\">classe<\/span> SampleModule <span style=\"color: #008000;\">:<\/span> Nancy<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">NancyModule<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\n<span style=\"color: #0600ff; font-weight: bold;\">p\u00fablico<\/span> SampleModule<span style=\"color: #008000;\">(<\/span><span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\nObter<span style=\"color: #008000;\">[<\/span><span style=\"color: #666666;\">&#8220;\/&#8221;<\/span><span style=\"color: #008000;\">]<\/span> <span style=\"color: #008000;\">=<\/span> _ <span style=\"color: #008000;\">=&gt;<\/span> <span style=\"color: #666666;\">\"Hello World!\"<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><\/div>\n<\/div>\n<p>Para demonstrar como criar um endpoint XDCR usando o Nancy, publiquei um projeto do Couchbase Labs no GitHub chamado <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-xdcr-nancy\">couchbase-xdcr-nancy<\/a>.  Esse projeto se baseia em grande parte no projeto de Jasdeep <a href=\"https:\/\/github.com\/scalabl3\/couchbase-xdcr-sinatra\">couchbase-xdcr-sinatra<\/a> c\u00f3digo.<\/p>\n<p>Dentro do projeto do Visual Studio, voc\u00ea encontrar\u00e1 v\u00e1rios arquivos de canaliza\u00e7\u00e3o.  N\u00e3o analisarei o c\u00f3digo em detalhes aqui, mas mostrarei alguns destaques.  O c\u00f3digo mais importante est\u00e1 dentro do arquivo <em>XdcrModule<\/em> class.  \u00c9 nela que voc\u00ea encontrar\u00e1 os manipuladores para as v\u00e1rias solicita\u00e7\u00f5es de recursos feitas pelo servi\u00e7o XDCR.<\/p>\n<p>No construtor desse m\u00f3dulo, voc\u00ea encontrar\u00e1 v\u00e1rios manipuladores de GET que lidam com solicita\u00e7\u00f5es para URIs que come\u00e7am com \/pools.  Esses s\u00e3o efetivamente URIs de handshake usados pelo XDCR para descobrir informa\u00e7\u00f5es sobre o cluster e seus buckets (semelhante aos pontos de extremidade usados pelos SDKs do Couchbase para inicializar inst\u00e2ncias de clientes).  Observe que, nesta amostra, o bucket est\u00e1 codificado como \"padr\u00e3o\".  Voc\u00ea poderia facilmente modificar esse valor ou torn\u00e1-lo uma defini\u00e7\u00e3o de configura\u00e7\u00e3o.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace;\">\n<p>Obter<span style=\"color: #008000;\">[<\/span><span style=\"color: #666666;\">\"\/pools\"<\/span><span style=\"color: #008000;\">]<\/span> <span style=\"color: #008000;\">=<\/span> x <span style=\"color: #008000;\">=&gt;<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\nvar output <span style=\"color: #008000;\">=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\npiscinas <span style=\"color: #008000;\">=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> <span style=\"color: #6666cc; font-weight: bold;\">objeto<\/span><span style=\"color: #008000;\">[<\/span><span style=\"color: #008000;\">]<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\n<a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> <span style=\"color: #008000;\">{<\/span> nome <span style=\"color: #008000;\">=<\/span> <span style=\"color: #666666;\">\"default\"<\/span>, uri <span style=\"color: #008000;\">=<\/span> <span style=\"color: #666666;\">\"\/pools\/default?uuid=\"<\/span> <span style=\"color: #008000;\">+<\/span> UUID_POOL <span style=\"color: #008000;\">}<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span>,<br \/>\nuuid <span style=\"color: #008000;\">=<\/span> UUID_POOL<br \/>\n<span style=\"color: #008000;\">}<\/span><span style=\"color: #008000;\">;<\/span><\/p>\n<p><span style=\"color: #0600ff; font-weight: bold;\">retorno<\/span> Resposta<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">ComoJson<\/span><span style=\"color: #008000;\">(<\/span>sa\u00edda<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><span style=\"color: #008000;\">;<\/span><\/p>\n<\/div>\n<\/div>\n<p>Ap\u00f3s os manipuladores GET, h\u00e1 alguns manipuladores POST que respondem ao feed real do XDCR.  O servi\u00e7o XDCR passar\u00e1 par\u00e2metros como parte do caminho.  Rotas baseadas em Regex s\u00e3o usadas para essa finalidade.<\/p>\n<p>O primeiro manipulador de POST recebe uma lista de documentos e suas revis\u00f5es do servi\u00e7o XDCR.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace;\">\n<p>Postar<span style=\"color: #008000;\">[<\/span>DIFEREN\u00c7A DE REGEX_REVS<span style=\"color: #008000;\">]<\/span> <span style=\"color: #008000;\">=<\/span> x <span style=\"color: #008000;\">=&gt;<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\nvar corpo <span style=\"color: #008000;\">=<\/span> <span style=\"color: #666666;\">&#8220;&#8221;<\/span><span style=\"color: #008000;\">;<\/span><br \/>\nContexto<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Solicita\u00e7\u00e3o<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Corpo<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Posi\u00e7\u00e3o<\/span> <span style=\"color: #008000;\">=<\/span> <span style=\"color: #ff0000;\">0<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #0600ff; font-weight: bold;\">usando<\/span> <span style=\"color: #008000;\">(<\/span>var sr <span style=\"color: #008000;\">=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> StreamReader<span style=\"color: #008000;\">(<\/span>Contexto<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Solicita\u00e7\u00e3o<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Corpo<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\ncorpo <span style=\"color: #008000;\">=<\/span> sr<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">ReadToEnd<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><br \/>\nvar jobj <span style=\"color: #008000;\">=<\/span> JObjeto<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Analisar<\/span><span style=\"color: #008000;\">(<\/span>corpo<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><\/p>\n<p>var outDict <span style=\"color: #008000;\">=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> Dicion\u00e1rio<span style=\"color: #008000;\">&lt;<\/span><span style=\"color: #6666cc; font-weight: bold;\">string<\/span>, <span style=\"color: #6666cc; font-weight: bold;\">objeto<\/span><span style=\"color: #008000;\">=<\/span><span style=\"color: #666666;\">&#8220;&#8221;<\/span><span style=\"color: #008000;\">&gt;<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #0600ff; font-weight: bold;\">antes de<\/span> <span style=\"color: #008000;\">(<\/span>var item <span style=\"color: #0600ff; font-weight: bold;\">em<\/span> trabalho<span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\nvar chave <span style=\"color: #008000;\">=<\/span> item<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Chave<\/span><span style=\"color: #008000;\">;<\/span><br \/>\nvar rev <span style=\"color: #008000;\">=<\/span> item<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">ToString<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #0600ff; font-weight: bold;\">se<\/span> <span style=\"color: #008000;\">(<\/span>manipulador<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">IsMissing<\/span><span style=\"color: #008000;\">(<\/span>chave, rev<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\noutDict<span style=\"color: #008000;\">[<\/span>chave<span style=\"color: #008000;\">]<\/span> <span style=\"color: #008000;\">=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> <span style=\"color: #008000;\">{<\/span> ausente <span style=\"color: #008000;\">=<\/span> rev <span style=\"color: #008000;\">}<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><\/p>\n<p><span style=\"color: #0600ff; font-weight: bold;\">retorno<\/span> Resposta<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">ComoJson<\/span><span style=\"color: #008000;\">(<\/span>outDict<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><span style=\"color: #008000;\">;<span style=\"color: #6666cc; font-weight: bold;\">string<\/span>,<span style=\"color: #008000;\">&gt;<\/span><\/span><\/p>\n<\/div>\n<\/div>\n<p>Nesse manipulador, o JSON \u00e9 analisado para descobrir a chave e a revis\u00e3o.  Se essa combina\u00e7\u00e3o n\u00e3o for replicada, ela ser\u00e1 adicionada \u00e0 lista de chaves \"ausentes\" inclu\u00eddas na resposta \u00e0 solicita\u00e7\u00e3o.  O XDCR enviar\u00e1 esses documentos para outro manipulador de POST, onde eles ser\u00e3o criados.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace;\">\n<p>Postar<span style=\"color: #008000;\">[<\/span>REGEX_BULK_DOCS<span style=\"color: #008000;\">]<\/span> <span style=\"color: #008000;\">=<\/span> x <span style=\"color: #008000;\">=&gt;<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\nvar corpo <span style=\"color: #008000;\">=<\/span> <span style=\"color: #666666;\">&#8220;&#8221;<\/span><span style=\"color: #008000;\">;<\/span><br \/>\nContexto<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Solicita\u00e7\u00e3o<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Corpo<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Posi\u00e7\u00e3o<\/span> <span style=\"color: #008000;\">=<\/span> <span style=\"color: #ff0000;\">0<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #0600ff; font-weight: bold;\">usando<\/span> <span style=\"color: #008000;\">(<\/span>var sr <span style=\"color: #008000;\">=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> StreamReader<span style=\"color: #008000;\">(<\/span>Contexto<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Solicita\u00e7\u00e3o<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Corpo<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\ncorpo <span style=\"color: #008000;\">=<\/span> sr<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">ReadToEnd<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><br \/>\nvar jobj <span style=\"color: #008000;\">=<\/span> JObjeto<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Analisar<\/span><span style=\"color: #008000;\">(<\/span>corpo<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><\/p>\n<p>var newEdits <span style=\"color: #008000;\">=<\/span> trabalho<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span><span style=\"color: #008000;\">&lt;<\/span><span style=\"color: #6666cc; font-weight: bold;\">bool<\/span><span style=\"color: #008000;\">&gt;<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"new_edits\"<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\nvar docs <span style=\"color: #008000;\">=<\/span> trabalho<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span><span style=\"color: #008000;\">&lt;<\/span>JArray<span style=\"color: #008000;\">&gt;<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"docs\"<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #0600ff; font-weight: bold;\">antes de<\/span> <span style=\"color: #008000;\">(<\/span>var doc <span style=\"color: #0600ff; font-weight: bold;\">em<\/span> documentos<span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\nvar originalDoc <span style=\"color: #008000;\">=<\/span> Codifica\u00e7\u00e3o<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">UTF8<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">GetString<\/span><span style=\"color: #008000;\">(<\/span>Converter<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">FromBase64String<\/span><span style=\"color: #008000;\">(<\/span>doc<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span><span style=\"color: #008000;\">&lt;<\/span><span style=\"color: #6666cc; font-weight: bold;\">string<\/span><span style=\"color: #008000;\">&gt;<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"base64\"<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\nvar meta <span style=\"color: #008000;\">=<\/span> doc<span style=\"color: #008000;\">[<\/span><span style=\"color: #666666;\">\"meta\"<\/span><span style=\"color: #008000;\">]<\/span> <span style=\"color: #0600ff; font-weight: bold;\">como<\/span> JObjeto<span style=\"color: #008000;\">;<\/span><\/p>\n<p>var document <span style=\"color: #008000;\">=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> Documento<br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\nId <span style=\"color: #008000;\">=<\/span> meta<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span><span style=\"color: #008000;\">&lt;<\/span><span style=\"color: #6666cc; font-weight: bold;\">string<\/span><span style=\"color: #008000;\">&gt;<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"id\"<\/span><span style=\"color: #008000;\">)<\/span>,<br \/>\nRevis\u00e3o <span style=\"color: #008000;\">=<\/span> meta<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span><span style=\"color: #008000;\">&lt;<\/span><span style=\"color: #6666cc; font-weight: bold;\">string<\/span><span style=\"color: #008000;\">&gt;<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"rev\"<\/span><span style=\"color: #008000;\">)<\/span>,<br \/>\nVencimento <span style=\"color: #008000;\">=<\/span> meta<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span><span style=\"color: #008000;\">&lt;<\/span><span style=\"color: #6666cc; font-weight: bold;\">int<\/span><span style=\"color: #008000;\">&gt;<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"expira\u00e7\u00e3o\"<\/span><span style=\"color: #008000;\">)<\/span>,<br \/>\nBandeiras <span style=\"color: #008000;\">=<\/span> meta<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span><span style=\"color: #008000;\">&lt;<\/span><span style=\"color: #6666cc; font-weight: bold;\">int<\/span><span style=\"color: #008000;\">&gt;<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"flags\" (sinalizadores)<\/span><span style=\"color: #008000;\">)<\/span>,<br \/>\nValor <span style=\"color: #008000;\">=<\/span> originalDoc<br \/>\n<span style=\"color: #008000;\">}<\/span><span style=\"color: #008000;\">;<\/span><\/p>\n<p>manipulador<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">CriarDocumento<\/span><span style=\"color: #008000;\">(<\/span>documento<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><\/p>\n<p><span style=\"color: #0600ff; font-weight: bold;\">retorno<\/span> HttpStatusCode<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Criado<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><span style=\"color: #008000;\">;<\/span><\/p>\n<\/div>\n<\/div>\n<p>Na amostra, inclu\u00ed uma interface muito simples usada para criar um manipulador conect\u00e1vel que verificar\u00e1 a exist\u00eancia do documento e o criar\u00e1 quando necess\u00e1rio.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace;\">\n<p><span style=\"color: #0600ff; font-weight: bold;\">p\u00fablico<\/span> <span style=\"color: #6666cc; font-weight: bold;\">interface<\/span> IReplicationHandler<br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\n<span style=\"color: #6666cc; font-weight: bold;\">bool<\/span> IsMissing<span style=\"color: #008000;\">(<\/span><span style=\"color: #6666cc; font-weight: bold;\">string<\/span> chave, <span style=\"color: #6666cc; font-weight: bold;\">string<\/span> rev<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><\/p>\n<p><span style=\"color: #6666cc; font-weight: bold;\">vazio<\/span> CriarDocumento<span style=\"color: #008000;\">(<\/span>Documento Documento<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><\/p>\n<\/div>\n<\/div>\n<p>Para fins de demonstra\u00e7\u00e3o, tamb\u00e9m inclu\u00ed um <em>XmlReplicador<\/em> que implementa essa interface.  Essa classe usa LINQ para XML para atualizar e consultar um documento XML que cont\u00e9m documentos alimentados pelo servi\u00e7o XDCR.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace;\">\n<p><span style=\"color: #0600ff; font-weight: bold;\">p\u00fablico<\/span> <span style=\"color: #6666cc; font-weight: bold;\">classe<\/span> XmlReplicador <span style=\"color: #008000;\">:<\/span> IReplicationHandler<br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\n<span style=\"color: #0600ff; font-weight: bold;\">privado<\/span> <span style=\"color: #0600ff; font-weight: bold;\">somente leitura<\/span> <span style=\"color: #6666cc; font-weight: bold;\">string<\/span> _caminho<span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #0600ff; font-weight: bold;\">privado<\/span> XDocumento doc <span style=\"color: #008000;\">=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> XDocument<span style=\"color: #008000;\">(<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><\/p>\n<p><span style=\"color: #0600ff; font-weight: bold;\">p\u00fablico<\/span> XmlReplicador<span style=\"color: #008000;\">(<\/span><span style=\"color: #6666cc; font-weight: bold;\">string<\/span> caminho <span style=\"color: #008000;\">=<\/span> <span style=\"color: #666666;\">@\"C:tempreplication.xml\"<\/span><span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\n_caminho <span style=\"color: #008000;\">=<\/span> caminho<span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #0600ff; font-weight: bold;\">se<\/span> <span style=\"color: #008000;\">(<\/span><span style=\"color: #008000;\">!<\/span> Arquivo<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Existe<\/span><span style=\"color: #008000;\">(<\/span>_caminho<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\n<span style=\"color: #008080; font-style: italic;\">\/\/var xml = new XElement(\"documents\");<\/span><br \/>\nArquivo<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">WriteAllText<\/span><span style=\"color: #008000;\">(<\/span>caminho,<span style=\"color: #666666;\">&#8220;<!--?xml version=&lt;span style=\"color: #008080; font-weight: bold;\"&gt;\"&lt;\/span&gt;1.0&lt;span style=\"color: #008080; font-weight: bold;\"&gt;\"&lt;\/span&gt; encoding=&lt;span style=\"color: #008080; font-weight: bold;\"&gt;\"&lt;\/span&gt;utf-8&lt;span style=\"color: #008080; font-weight: bold;\"&gt;\"&lt;\/span&gt;?-->&#8220;<\/span>, Codifica\u00e7\u00e3o<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">UTF8<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><\/p>\n<p><span style=\"color: #008000;\">&#8230;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><\/p>\n<\/div>\n<\/div>\n<p>Para verificar se o documento existe, <em>IsMissing <\/em>consultar\u00e1 o XML para um <em>documento <\/em>que tem um elemento filho <em>id<\/em> e <em>rev<\/em> elementos que correspondem \u00e0 chave e \u00e0 revis\u00e3o fornecidas.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace;\"><span style=\"color: #0600ff; font-weight: bold;\">p\u00fablico<\/span> <span style=\"color: #6666cc; font-weight: bold;\">bool<\/span> IsMissing<span style=\"color: #008000;\">(<\/span><span style=\"color: #6666cc; font-weight: bold;\">string<\/span> chave, <span style=\"color: #6666cc; font-weight: bold;\">string<\/span> rev<span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\nvar xml <span style=\"color: #008000;\">=<\/span> XDocument<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Carga<\/span><span style=\"color: #008000;\">(<\/span>_caminho<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\nvar documentos <span style=\"color: #008000;\">=<\/span> xml<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Documento<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Raiz<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Elementos<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"document\" (documento)<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\nvar document <span style=\"color: #008000;\">=<\/span> documentos<span style=\"color: #008000;\">.<\/span><span style=\"color: #0600ff; font-weight: bold;\">Onde<\/span><span style=\"color: #008000;\">(<\/span>d <span style=\"color: #008000;\">=&gt;<\/span> d<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Elemento<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"meta\"<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Elemento<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"rev\"<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span> <span style=\"color: #008000;\">==<\/span> rev <span style=\"color: #008000;\">&amp;&amp;<\/span> d<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Elemento<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"meta\"<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Elemento<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"id\"<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span> <span style=\"color: #008000;\">==<\/span> chave<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #0600ff; font-weight: bold;\">retorno<\/span> documento<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Contagem<\/span><span style=\"color: #008000;\">(<\/span><span style=\"color: #008000;\">)<\/span> <span style=\"color: #008000;\">==<\/span> <span style=\"color: #ff0000;\">0<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><\/div>\n<\/div>\n<p>Os documentos s\u00e3o criados simplesmente adicionando-os ao arquivo XML existente.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace;\">\n<p><span style=\"color: #0600ff; font-weight: bold;\">p\u00fablico<\/span> <span style=\"color: #6666cc; font-weight: bold;\">vazio<\/span> CriarDocumento<span style=\"color: #008000;\">(<\/span>Documento Documento<span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">{<\/span><br \/>\nvar xml <span style=\"color: #008000;\">=<\/span> XDocument<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Carga<\/span><span style=\"color: #008000;\">(<\/span>_caminho<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><\/p>\n<p>var docElement <span style=\"color: #008000;\">=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> XElement<span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"document\" (documento)<\/span>,<br \/>\n<a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> XElement<span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"meta\"<\/span>,<br \/>\n<a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> XElement<span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"id\"<\/span>, documento<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Id<\/span><span style=\"color: #008000;\">)<\/span>,<br \/>\n<a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> XElement<span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"rev\"<\/span>, documento<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Revis\u00e3o<\/span><span style=\"color: #008000;\">)<\/span>,<br \/>\n<a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> XElement<span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"expira\u00e7\u00e3o\"<\/span>, documento<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Vencimento<\/span><span style=\"color: #008000;\">)<\/span>,<br \/>\n<a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> XElement<span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"flags\" (sinalizadores)<\/span>, documento<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Bandeiras<\/span><span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">)<\/span>,<br \/>\n<a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> XElement<span style=\"color: #008000;\">(<\/span><span style=\"color: #666666;\">\"valor\"<\/span>, <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000;\">novo<\/span><\/a> XCData<span style=\"color: #008000;\">(<\/span>documento<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Valor<\/span><span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">)<\/span><br \/>\n<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><\/p>\n<p>xml<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Documento<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Raiz<\/span><span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Adicionar<\/span><span style=\"color: #008000;\">(<\/span>docElement<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\nxml<span style=\"color: #008000;\">.<\/span><span style=\"color: #0000ff;\">Salvar<\/span><span style=\"color: #008000;\">(<\/span>_caminho<span style=\"color: #008000;\">)<\/span><span style=\"color: #008000;\">;<\/span><br \/>\n<span style=\"color: #008000;\">}<\/span><\/p>\n<\/div>\n<\/div>\n<p>Por padr\u00e3o, configurei o Nancy para usar o servidor de desenvolvimento ASP.NET.  Voc\u00ea pode hospedar o Nancy como quiser (IIS, auto-hospedado, etc.).  Depois de executar o projeto, ser\u00e1 necess\u00e1rio configurar o XDCR no console de administra\u00e7\u00e3o do Couchbase.  Alguns valores a saber:<\/p>\n<ul>\n<li>Porta Nancy - 8675 (voc\u00ea pode modificar isso nas configura\u00e7\u00f5es do projeto)<\/li>\n<li>Autentica\u00e7\u00e3o b\u00e1sica de Nancy: Administrator:qwerty (modifique isso em <em>XdcrUserValidator<\/em>)<\/li>\n<\/ul>\n<p>Por fim, para colocar seu pr\u00f3prio plug-in <em>IReplicationHandler<\/em> basta registrar seu tipo na inst\u00e2ncia <em>ApplicationBootstrapper<\/em> (ou excluir as outras implementa\u00e7\u00f5es).<\/p>\n<p><em>container.Register(new XmlReplicator());<\/em><\/p>\n<p>Lembre-se de que os projetos do CouchbaseLabs n\u00e3o t\u00eam suporte total, mas fique \u00e0 vontade para postar perguntas nos f\u00f3runs.<\/p>","protected":false},"excerpt":{"rendered":"<p>You&#8217;re probably aware of the new Cross Data Center Replication (XDCR) feature of Couchbase Server 2.0.\u00a0 Its most obvious utility is to allow you to replicate data from one Couchbase cluster to another.\u00a0 However, there are more novel use cases [&hellip;]<\/p>","protected":false},"author":22,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[10126,9415],"tags":[],"ppma_author":[8980],"class_list":["post-1845","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-dotnet","category-xdcr"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.0 (Yoast SEO v26.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>XDCR with ASP.NET and Nancy - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/xdcr-aspnet-and-nancy\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"XDCR with ASP.NET and Nancy\" \/>\n<meta property=\"og:description\" content=\"You&#8217;re probably aware of the new Cross Data Center Replication (XDCR) feature of Couchbase Server 2.0.\u00a0 Its most obvious utility is to allow you to replicate data from one Couchbase cluster to another.\u00a0 However, there are more novel use cases [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/xdcr-aspnet-and-nancy\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T17:18:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:52:04+00:00\" \/>\n<meta name=\"author\" content=\"John Zablocki, NET. SDK Developer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"John Zablocki, NET. SDK Developer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/\"},\"author\":{\"name\":\"John Zablocki, NET. SDK Developer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ee312fb775c13d20a32f1d455888a282\"},\"headline\":\"XDCR with ASP.NET and Nancy\",\"datePublished\":\"2014-12-16T17:18:34+00:00\",\"dateModified\":\"2025-06-14T06:52:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/\"},\"wordCount\":1037,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"ASP.NET\",\"Cross Data Center Replication (XDCR)\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/\",\"name\":\"XDCR with ASP.NET and Nancy - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T17:18:34+00:00\",\"dateModified\":\"2025-06-14T06:52:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"XDCR with ASP.NET and Nancy\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ee312fb775c13d20a32f1d455888a282\",\"name\":\"John Zablocki, NET. SDK Developer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/201925d9efc4992ce80385b76fdea34b\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8c5a77152c796c424a3f7f6d9fa31a999a7fe115d64c2acc93c4c0c014e6512a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8c5a77152c796c424a3f7f6d9fa31a999a7fe115d64c2acc93c4c0c014e6512a?s=96&d=mm&r=g\",\"caption\":\"John Zablocki, NET. SDK Developer, Couchbase\"},\"description\":\"John Zablocki is a NET. SDK Developer at Couchbase. John is also the organizer of Beantown ALT.NET and a former adjunct at Fairfield University. You can also check out the book on Amazon named \\\"Couchbase Essentials\\\" which explains how to install and configure Couchbase Server.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/john-zablocki\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"XDCR with ASP.NET and Nancy - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/xdcr-aspnet-and-nancy\/","og_locale":"pt_BR","og_type":"article","og_title":"XDCR with ASP.NET and Nancy","og_description":"You&#8217;re probably aware of the new Cross Data Center Replication (XDCR) feature of Couchbase Server 2.0.\u00a0 Its most obvious utility is to allow you to replicate data from one Couchbase cluster to another.\u00a0 However, there are more novel use cases [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/xdcr-aspnet-and-nancy\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T17:18:34+00:00","article_modified_time":"2025-06-14T06:52:04+00:00","author":"John Zablocki, NET. SDK Developer, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"John Zablocki, NET. SDK Developer, Couchbase","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/"},"author":{"name":"John Zablocki, NET. SDK Developer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ee312fb775c13d20a32f1d455888a282"},"headline":"XDCR with ASP.NET and Nancy","datePublished":"2014-12-16T17:18:34+00:00","dateModified":"2025-06-14T06:52:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/"},"wordCount":1037,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["ASP.NET","Cross Data Center Replication (XDCR)"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/","url":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/","name":"XDCR with ASP.NET and Nancy - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T17:18:34+00:00","dateModified":"2025-06-14T06:52:04+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/xdcr-aspnet-and-nancy\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"XDCR with ASP.NET and Nancy"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/ee312fb775c13d20a32f1d455888a282","name":"John Zablocki, NET. SDK, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/201925d9efc4992ce80385b76fdea34b","url":"https:\/\/secure.gravatar.com\/avatar\/8c5a77152c796c424a3f7f6d9fa31a999a7fe115d64c2acc93c4c0c014e6512a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8c5a77152c796c424a3f7f6d9fa31a999a7fe115d64c2acc93c4c0c014e6512a?s=96&d=mm&r=g","caption":"John Zablocki, NET. SDK Developer, Couchbase"},"description":"John Zablocki is a NET. SDK Developer at Couchbase. John is also the organizer of Beantown ALT.NET and a former adjunct at Fairfield University. You can also check out the book on Amazon named \"Couchbase Essentials\" which explains how to install and configure Couchbase Server.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/john-zablocki\/"}]}},"authors":[{"term_id":8980,"user_id":22,"is_guest":0,"slug":"john-zablocki","display_name":"John Zablocki, NET. SDK Developer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/8c5a77152c796c424a3f7f6d9fa31a999a7fe115d64c2acc93c4c0c014e6512a?s=96&d=mm&r=g","author_category":"","last_name":"Zablocki","first_name":"John","job_title":"","user_url":"","description":"John Zablocki \u00e9 um desenvolvedor NET. SDK Developer na Couchbase. John tamb\u00e9m \u00e9 o organizador do Beantown ALT.NET e ex-adjunto da Fairfield University.\r\nVoc\u00ea tamb\u00e9m pode conferir o livro na Amazon chamado \"Couchbase Essentials\", que explica como instalar e configurar o Couchbase Server."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1845","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1845"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1845\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1845"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1845"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1845"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}