{"id":2733,"date":"2017-02-16T16:38:16","date_gmt":"2017-02-17T00:38:16","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2733"},"modified":"2025-06-13T17:23:33","modified_gmt":"2025-06-14T00:23:33","slug":"introducing-couchbase-net-2-4-0-net-core-ga","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/introducing-couchbase-net-2-4-0-net-core-ga\/","title":{"rendered":"Apresentando o Couchbase .NET 2.4.0 - .NET Core GA"},"content":{"rendered":"<p>Esta vers\u00e3o \u00e9 a vers\u00e3o GA oficial do suporte do .NET Core para o SDK do Couchbase .NET! O .NET Core \u00e9 a encarna\u00e7\u00e3o mais recente do .NET framework e \u00e9 descrito como\u00a0<em>\".NET Core \u00e9 uma plataforma extremamente r\u00e1pida, leve e modular para criar aplicativos e servi\u00e7os da Web que s\u00e3o executados no Windows, Linux e Mac\"<\/em><\/p>\n<p>Espere um minuto... leia isso novamente:\u00a0<em>O \".NET Core \u00e9 uma plataforma extremamente r\u00e1pida, leve e modular para a cria\u00e7\u00e3o de aplicativos e servi\u00e7os da Web que\u00a0<\/em><strong>Executar no Windows, Linux e Mac<\/strong><em>&#8220;<\/em>. Aplicativos Microsoft .NET em execu\u00e7\u00e3o no OSX e no Linux? Em que tipo de mundo bizarro estamos vivendo? \u00c9 a \"nova\" Microsoft, com certeza!<\/p>\n<p>Nesta postagem do blog, abordarei o que h\u00e1 na vers\u00e3o 2.4.0, as altera\u00e7\u00f5es no empacotamento (NuGet) e a vers\u00e3o do .NET compat\u00edvel com o SDK. Tamb\u00e9m demonstraremos alguns dos novos recursos, como Datastructures.<\/p>\n<p><strong>O que h\u00e1 nesta vers\u00e3o?<\/strong><\/p>\n<p>O 2.4.0 \u00e9 um grande lan\u00e7amento com mais de 30 commits. Se considerarmos que lan\u00e7amos 3 Developer Previews antes da vers\u00e3o 2.4.0, na verdade h\u00e1 muito, muito mais commits que levaram a essa vers\u00e3o nos \u00faltimos 6 meses. Aqui est\u00e1 uma vis\u00e3o geral de alguns dos recursos mais impressionantes - voc\u00ea pode ver todos os commits na se\u00e7\u00e3o \"Notas da vers\u00e3o\" abaixo:<\/p>\n<p><strong>Suporte ao .NET Core<\/strong><\/p>\n<p>Obviamente, o recurso mais importante do 2.4.0 \u00e9 o suporte ao .NET Core, o que, de acordo com o par\u00e1grafo inicial, significa que agora voc\u00ea pode desenvolver no Mac OS ou no Windows e implantar no Linux (ou vice-versa, mas as ferramentas ainda s\u00e3o um pouco imaturas). Esse \u00e9 um \u00f3timo material e uma grande mudan\u00e7a para o desenvolvedor tradicional do Windows.<\/p>\n<p>Se voc\u00ea n\u00e3o conhece o .NET Core, pode ler mais sobre ele no site\u00a0<a href=\"https:\/\/dotnet.github.io\/\">Site do .NET Core<\/a>. Um aspecto interessante \u00e9 que ele \u00e9 de c\u00f3digo aberto (Apache 2.0) e o c\u00f3digo-fonte est\u00e1 dispon\u00edvel no Github.<\/p>\n<p>O SDK do Couchbase \u00e9 compat\u00edvel especificamente com o netstandard1.5 ou superior. Testamos o SDK usando a vers\u00e3o 1.0.0-preview2-1-003177 das ferramentas de linha de comando.<\/p>\n<p><strong>Mudan\u00e7as na embalagem<\/strong><\/p>\n<p>Assim como nas tr\u00eas visualiza\u00e7\u00f5es pr\u00e9vias do desenvolvedor, o pacote NuGet conter\u00e1 bin\u00e1rios para o .NET Full Framework (voltado para o .NET 4.5 ou superior), mas tamb\u00e9m para o .NET Core (voltado para o .NET Core 1.1). Dependendo do projeto de destino para o qual voc\u00ea est\u00e1 incluindo a depend\u00eancia, os bin\u00e1rios corretos ser\u00e3o usados.<\/p>\n<p>Portanto, se o seu projeto do Visual Studio for um aplicativo .NET Full Framework maior ou igual a 4.5, voc\u00ea obter\u00e1 os bin\u00e1rios para a vers\u00e3o full framework do .NET. Da mesma forma, se seu aplicativo for um aplicativo .NET Core, a vers\u00e3o .NET Core dos bin\u00e1rios ser\u00e1 usada. N\u00e3o deve haver nada que voc\u00ea precise fazer para habilitar isso.<\/p>\n<p>A vers\u00e3o mais antiga do .NET 4.5 dos pacotes n\u00e3o ser\u00e1 mais lan\u00e7ada; a 2.3.11 \u00e9 a \u00faltima vers\u00e3o com suporte da s\u00e9rie 2.3.X.<\/p>\n<p><strong>Registro em log do MS para o Core<\/strong><\/p>\n<p>Para o .NET Core, decidimos mudar o uso do\u00a0<a href=\"https:\/\/github.com\/net-commons\/common-logging\">Comum.Registro<\/a>\u00a0para o MS Logging, principalmente porque nenhum terceiro (<a href=\"https:\/\/logging.apache.org\/log4net\/\">log4net<\/a>\u00a0por exemplo) t\u00eam suporte est\u00e1vel para o .NET Core no momento.<\/p>\n<p>Al\u00e9m disso, ao mudar de <span class=\"lang:default decode:true crayon-inline\">Comum.Registro<\/span>\u00a0 Ao usar o Common.Logging para o MS Logging, removemos mais uma depend\u00eancia de terceiros, o que \u00e9 sempre bom. N\u00e3o que o Common.Logging n\u00e3o fosse suficiente, mas faz mais sentido usar uma depend\u00eancia da Microsoft.<\/p>\n<p>Aqui est\u00e1 um exemplo de configura\u00e7\u00e3o do cliente 2.4.0 voltado para o .NET Core e usando o NLog:<\/p>\n<p>Primeiro, adicione as depend\u00eancias ao project.json:<\/p>\n<pre class=\"lang:c# decode:true\">{\r\n  \"version\": \"1.0.0-*\",\r\n  \"buildOptions\": {\r\n    \"emitEntryPoint\": true,\r\n    \"copyToOutput\": {\r\n      \"include\": [ \"config.json\", \"nlog.config\" ]\r\n    }\r\n  },\r\n\r\n  \"dependencies\": {\r\n    \"CouchbaseNetClient\": \"2.4.0-dp6\",\r\n    \"NLog.Extensions.Logging\": \"1.0.0-rtm-beta1\",\r\n    \"Microsoft.NETCore.App\": {\r\n      \"type\": \"platform\",\r\n      \"version\": \"1.0.1\"\r\n    },\r\n    \"Microsoft.Extensions.Logging.Debug\": \"1.1.0\",\r\n    \"Microsoft.Extensions.Logging\": \"1.1.0\"\r\n  },\r\n\r\n  \"frameworks\": {\r\n    \"netcoreapp1.0\": {\r\n      \"imports\": \"dnxcore50\"\r\n    }\r\n  }\r\n}<\/pre>\n<p>Em seguida, adicione um arquivo nlog.config ao seu projeto com o seguinte conte\u00fado:<\/p>\n<pre class=\"lang:xhtml decode:true\">&lt;?xml version=\"1.0\" encoding=\"utf-8\" ?&gt;\r\n&lt;nlog xmlns=\"https:\/\/www.nlog-project.org\/schemas\/NLog.xsd\"\r\n      xmlns:xsi=\"https:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n      autoReload=\"true\"\r\n      internalLogLevel=\"Debug\"\r\n      internalLogFile=\"c:\\temp\\internal-nlog.txt\"&gt;\r\n\r\n  &lt;!-- define various log targets --&gt;\r\n  &lt;targets&gt;\r\n    &lt;!-- write logs to file --&gt;\r\n    &lt;target xsi:type=\"File\" name=\"allfile\" fileName=\"c:\\temp\\nlog-all-${shortdate}.log\"\r\n                layout=\"${longdate}|${event-properties:item=EventId.Id}|${logger}|${uppercase:${level}}|${message} ${exception}\" \/&gt;\r\n\r\n    &lt;target xsi:type=\"Null\" name=\"blackhole\" \/&gt;\r\n  &lt;\/targets&gt;\r\n\r\n  &lt;rules&gt;\r\n    &lt;!--All logs, including from Microsoft--&gt;\r\n    &lt;logger name=\"*\" minlevel=\"Trace\" writeTo=\"allfile\" \/&gt;\r\n  &lt;\/rules&gt;\r\n&lt;\/nlog&gt;<\/pre>\n<p class=\"lang:c# decode:true\">Por fim, adicione o c\u00f3digo para configurar o SDK do Couchbase para registro:<\/p>\n<pre class=\"lang:c# decode:true\">using Couchbase;\r\nusing Couchbase.Logging;\r\nusing Microsoft.Extensions.Logging;\r\nusing NLog.Extensions.Logging;\r\n\r\nnamespace ConsoleApp2\r\n{\r\n    public class Program\r\n    {\r\n        public static void Main(string[] args)\r\n        {\r\n            var factory = new LoggerFactory();\r\n            factory.AddDebug();\r\n            factory.AddNLog();\r\n            factory.ConfigureNLog(\"nlog.config\");\r\n\r\n            \/\/configure logging on the couchbase client\r\n            var config = new ClientConfiguration\r\n            {\r\n                LoggerFactory = factory\r\n            };\r\n\r\n            var cluster = new Cluster(config);\r\n            \/\/use the couchbase client\r\n        }\r\n    }\r\n}<\/pre>\n<p>Observe que o project.json tem um <span class=\"lang:default decode:true crayon-inline\">copyToOutput.include<\/span>\u00a0 valor para <span class=\"lang:default decode:true crayon-inline\">nlog.config<\/span>\u00a0. Isso \u00e9 necess\u00e1rio para que o ferramental copie esse arquivo para o diret\u00f3rio de sa\u00edda quando constru\u00eddo.<\/p>\n<p>Agora, para os bin\u00e1rios do .NET 4.5 Full Framework, a depend\u00eancia do <span class=\"lang:default decode:true crayon-inline\">Comum.Registro <\/span>\u00a0permanece e qualquer configura\u00e7\u00e3o de registro existente deve funcionar como sempre funcionou.<\/p>\n<p><strong>Estruturas de dados<\/strong><\/p>\n<p>As estruturas de dados s\u00e3o uma nova maneira de trabalhar com documentos do Couchbase como se fossem estruturas de dados comuns da ci\u00eancia da computa\u00e7\u00e3o, como\u00a0<em>listas<\/em>,\u00a0<em>filas<\/em>,\u00a0<em>dicion\u00e1rios<\/em>\u00a0ou\u00a0<em>conjuntos<\/em>. H\u00e1 duas implementa\u00e7\u00f5es no SDK; uma como uma s\u00e9rie de m\u00e9todos em <span class=\"lang:default decode:true crayon-inline\">CouchbaseBucket<\/span>\u00a0 que fornecem funcionalidade para opera\u00e7\u00f5es comuns de estrutura de dados e outro como implementa\u00e7\u00f5es das interfaces dentro de <span class=\"lang:default decode:true crayon-inline\">System.Collections.Generics<\/span>\u00a0. Aqui est\u00e1 uma descri\u00e7\u00e3o de cada classe de estrutura de dados encontrada no SDK:<\/p>\n<ul>\n<li><span class=\"lang:default decode:true crayon-inline\">CouchbaseDictionary&lt;TKey, TValue&gt;<\/span>\u00a0: Representa uma cole\u00e7\u00e3o de chaves e valores armazenados em um documento do Couchbase.<\/li>\n<li><span class=\"lang:default decode:true crayon-inline\">CouchbaseList&lt;T&gt;<\/span>\u00a0: Representa uma cole\u00e7\u00e3o de objetos, armazenados no servidor Couchbase, que podem ser acessados individualmente por \u00edndice.<\/li>\n<li><span class=\"lang:c# decode:true crayon-inline\">CouchbaseQueue&lt;T&gt;<\/span>\u00a0: Fornece uma estrutura de dados persistente do Couchbase com comportamento FIFO.<\/li>\n<li><span class=\"lang:c# decode:true crayon-inline\">CouchbaseSet&lt;T&gt;<\/span>\u00a0: Fornece um conjunto persistente do Couchbase, que \u00e9 uma cole\u00e7\u00e3o de objetos sem duplicatas.<\/li>\n<\/ul>\n<p>Todas essas classes s\u00e3o encontradas na classe <span class=\"lang:default decode:true crayon-inline\">Couchbase.Collections<\/span>\u00a0 namespace. Aqui est\u00e1 um exemplo de uso de um <span class=\"lang:default decode:true crayon-inline\">CouchbaseQueue&lt;T&gt;<\/span>\u00a0:<\/p>\n<pre class=\"lang:c# decode:true\">var queue = new CouchbaseQueue&lt;Poco&gt;(_bucket, \"somekey\");\r\nqueue.Enqueue(new Poco { Name = \"pcoco1\" });\r\nqueue.Enqueue(new Poco { Name = \"pcoco2\" });\r\nqueue.Enqueue(new Poco { Name = \"pcoco3\" });\r\n\r\nvar item = queue.Dequeue();\r\nAssert.AreEqual(\"pcoco1\", item.Name);<\/pre>\n<p><strong>Multiplexa\u00e7\u00e3o de E\/S<\/strong><\/p>\n<p>O SDK do Couchbase usou o pooling de conex\u00f5es no passado para permitir alta taxa de transfer\u00eancia e escalonamento ao custo de lat\u00eancia e utiliza\u00e7\u00e3o de recursos. No Couchbase\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-.net-sdk-2.2.4-now-available\/\">2.2.4<\/a>\u00a0introduzimos um modelo de IO melhor, chamado Multiplexing IO ou MUX-IO, que o cliente pode ser configurado para usar (o padr\u00e3o era conex\u00f5es em pool).<\/p>\n<p>Na vers\u00e3o 2.4.0, estamos tornando o MUX-IO o modelo de E\/S padr\u00e3o e tornando o pooling de conex\u00f5es opcional. O que isso significa para voc\u00ea \u00e9 que algumas propriedades de pooling de conex\u00e3o em sua configura\u00e7\u00e3o ainda podem ser usadas no SDK. Por exemplo:<\/p>\n<ul>\n<li><span class=\"lang:default decode:true crayon-inline\">PoolConfiguration.MaxSize<\/span>\u00a0 ainda \u00e9 usado, mas deve ter valores relativamente pequenos - por exemplo, 5-10<\/li>\n<li><span class=\"lang:default decode:true crayon-inline\">PoolConfiguration.MinSize <\/span>\u00a0deve ser 0 ou 1<\/li>\n<\/ul>\n<p>Para desativar o MUX-IO, basta definir o par\u00e2metro\u00a0<span class=\"lang:default decode:true crayon-inline\">ClientConfiguration.UseConnectionPooling<\/span>para true (o padr\u00e3o \u00e9 false) para usar o pooling de conex\u00f5es:<\/p>\n<pre class=\"lang:c# decode:true\">var clientConfig = new ClientConfiguration{\r\n    UseConnectionPooling = false\r\n };\r\nvar cluster = new Cluster(clientConfig);\r\n \r\n\/\/open buckets and use the client<\/pre>\n<p><strong>Transmiss\u00e3o de N1QL e visualiza\u00e7\u00f5es<\/strong><\/p>\n<p>O streaming N1QL e as visualiza\u00e7\u00f5es s\u00e3o uma otimiza\u00e7\u00e3o de desempenho em determinados casos em que a quantidade de dados recuperados \u00e9 grande. Para entender o motivo, vamos considerar como funcionam as consultas sem streaming:<\/p>\n<ol>\n<li>Uma solicita\u00e7\u00e3o \u00e9 enviada ao servidor.<\/li>\n<li>O servidor faz seu processamento e retorna os resultados como um fluxo ap\u00f3s processar toda a resposta.<\/li>\n<li>O cliente armazena em buffer o fluxo inteiro e, em seguida, desserializa o fluxo em uma cole\u00e7\u00e3o do tipo \"T\", em que T \u00e9 o POCO para o qual cada resultado \u00e9 mapeado.<\/li>\n<li>O servidor retorna a lista para o aplicativo em seu <span class=\"lang:default decode:true crayon-inline\">IResultado<\/span><\/li>\n<\/ol>\n<p>O que pode dar errado aqui? Pense em resultados muito grandes e que os recursos de mem\u00f3ria s\u00e3o finitos: eventualmente, voc\u00ea sempre encontrar\u00e1 um <span class=\"lang:default decode:true crayon-inline\">OutOfMemoryException<\/span>\u00a0! H\u00e1 tamb\u00e9m outros efeitos colaterais relacionados \u00e0 coleta de lixo.<\/p>\n<p>Com clientes de streaming, o processo \u00e9 o seguinte:<\/p>\n<ol>\n<li>Uma solicita\u00e7\u00e3o \u00e9 enviada ao servidor<\/li>\n<li>O servidor faz o processamento e retorna os resultados como um fluxo assim que os cabe\u00e7alhos de resposta estiverem dispon\u00edveis.<\/li>\n<li>O cliente l\u00ea parcialmente os cabe\u00e7alhos e metadados e, em seguida, faz uma pausa at\u00e9 que a itera\u00e7\u00e3o ocorra.<\/li>\n<li>Quando o aplicativo come\u00e7a a iterar sobre o <span class=\"lang:default decode:true crayon-inline\">IResultado<\/span>\u00a0Cada item \u00e9 lido um de cada vez sem ser armazenado em uma cole\u00e7\u00e3o subjacente.<\/li>\n<\/ol>\n<p>A grande vantagem aqui \u00e9 que o conjunto de trabalho da mem\u00f3ria n\u00e3o aumentar\u00e1 \u00e0 medida que a cole\u00e7\u00e3o crescer e for redimensionada internamente pelo .NET. Em vez disso, voc\u00ea tem um tamanho de mem\u00f3ria de trabalho fixo e o GC pode ocorrer assim que o objeto lido for descartado.<\/p>\n<p>Para usar o N1QL de streaming e as exibi\u00e7\u00f5es, tudo o que voc\u00ea faz \u00e9 chamar o comando <span class=\"lang:default decode:true crayon-inline\">UseStreaming()<\/span>\u00a0e passar true para o fluxo:<\/p>\n<pre class=\"lang:c# decode:true\">var request = new QueryRequest(\"SELECT * FROM `travel-sample` LIMIT 100;\").UseStreaming(true);\r\nusing (var result = _bucket.Query&lt;dynamic&gt;(request))\r\n{\r\n    Console.WriteLine(result);\r\n}<\/pre>\n<p>Passar false significar\u00e1 que toda a resposta ser\u00e1 armazenada em buffer e processada antes de retornar.<\/p>\n<p><strong>Cancelamento de consulta N1QL<\/strong><\/p>\n<p>Esse recurso permite que as consultas N1QL de longa dura\u00e7\u00e3o sejam canceladas antes de serem conclu\u00eddas usando tokens de cancelamento de tarefas. Por exemplo:<\/p>\n<pre class=\"lang:c# decode:true\">var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(5));\r\n\r\nvar result = await _bucket.QueryAsync&lt;dynamic&gt;(queryRequest, cancellationTokenSource.Token);\r\n\/\/do something with the result<\/pre>\n<p>Esse commit foi feito por meio de uma contribui\u00e7\u00e3o da comunidade de\u00a0<a href=\"https:\/\/github.com\/brantburnett\">Brant Burnett<\/a>\u00a0de<a href=\"https:\/\/centeredgesoftware.com\/\">\u00a0CenteredgeSoftware.com<\/a>!<\/p>\n<p><strong>Observa\u00e7\u00e3o importante sobre TLS\/SSL no Linux<\/strong><\/p>\n<p>H\u00e1 um problema no Linux que voc\u00ea pode encontrar se estiver usando SSL: uma PlatformNotSupportedException ser\u00e1 lan\u00e7ada se voc\u00ea tiver uma vers\u00e3o da libcurl instalada no servidor &lt; 7.30.0. A solu\u00e7\u00e3o alternativa \u00e9 simplesmente atualizar sua instala\u00e7\u00e3o da libcurl no Linux para algo igual ou superior \u00e0 vers\u00e3o 7.30.0. Voc\u00ea pode ler mais sobre isso no ticket do Jira:\u00a0<a href=\"https:\/\/issues.couchbase.com\/browse\/NCBC-1296\">NCBC-1296<\/a>.<\/p>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>This release is the official GA release for .NET Core support for the Couchbase .NET SDK! .NET Core is the latest incarnation of the .NET framework and its described as\u00a0&#8220;.NET Core is a blazing fast, lightweight and modular platform for [&hellip;]<\/p>","protected":false},"author":21,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,1812],"tags":[1749,1800],"ppma_author":[8970],"class_list":["post-2733","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-n1ql-query","tag-core","tag-data-structures"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.5 (Yoast SEO v26.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Introducing Couchbase .NET 2.4.0 - .NET Core GA - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Introducing the Couchbase .NET SDK for Microsoft Core and Full Framework. Including support for Datastructures, N1QL and View Streaming API and MS Logging.\" \/>\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\/introducing-couchbase-net-2-4-0-net-core-ga\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing Couchbase .NET 2.4.0 - .NET Core GA\" \/>\n<meta property=\"og:description\" content=\"Introducing the Couchbase .NET SDK for Microsoft Core and Full Framework. Including support for Datastructures, N1QL and View Streaming API and MS Logging.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/introducing-couchbase-net-2-4-0-net-core-ga\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-17T00:38:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T00:23:33+00:00\" \/>\n<meta name=\"author\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@jeffrysmorris\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeff Morris, Senior Software Engineer, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/\"},\"author\":{\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341\"},\"headline\":\"Introducing Couchbase .NET 2.4.0 &#8211; .NET Core GA\",\"datePublished\":\"2017-02-17T00:38:16+00:00\",\"dateModified\":\"2025-06-14T00:23:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/\"},\"wordCount\":1324,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Core\",\"Data structures\"],\"articleSection\":[\".NET\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/\",\"name\":\"Introducing Couchbase .NET 2.4.0 - .NET Core GA - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-02-17T00:38:16+00:00\",\"dateModified\":\"2025-06-14T00:23:33+00:00\",\"description\":\"Introducing the Couchbase .NET SDK for Microsoft Core and Full Framework. Including support for Datastructures, N1QL and View Streaming API and MS Logging.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#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\/introducing-couchbase-net-2-4-0-net-core-ga\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Introducing Couchbase .NET 2.4.0 &#8211; .NET Core GA\"}]},{\"@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\/b678bdd9f7b21a33d43ea965865a3341\",\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g\",\"caption\":\"Jeff Morris, Senior Software Engineer, Couchbase\"},\"description\":\"Jeff Morris is a Senior Software Engineer at Couchbase. Prior to joining Couchbase, Jeff spent six years at Source Interlink as an Enterprise Web Architect. Jeff is responsible for the development of Couchbase SDKs and how to integrate with N1QL (query language).\",\"sameAs\":[\"https:\/\/x.com\/jeffrysmorris\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/jeff-morris\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Introducing Couchbase .NET 2.4.0 - .NET Core GA - The Couchbase Blog","description":"Apresentamos o Couchbase .NET SDK para Microsoft Core e Full Framework. Incluindo suporte para estruturas de dados, N1QL e API View Streaming e MS Logging.","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\/introducing-couchbase-net-2-4-0-net-core-ga\/","og_locale":"pt_BR","og_type":"article","og_title":"Introducing Couchbase .NET 2.4.0 - .NET Core GA","og_description":"Introducing the Couchbase .NET SDK for Microsoft Core and Full Framework. Including support for Datastructures, N1QL and View Streaming API and MS Logging.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/introducing-couchbase-net-2-4-0-net-core-ga\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-02-17T00:38:16+00:00","article_modified_time":"2025-06-14T00:23:33+00:00","author":"Jeff Morris, Senior Software Engineer, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@jeffrysmorris","twitter_misc":{"Written by":"Jeff Morris, Senior Software Engineer, Couchbase","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/"},"author":{"name":"Jeff Morris, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341"},"headline":"Introducing Couchbase .NET 2.4.0 &#8211; .NET Core GA","datePublished":"2017-02-17T00:38:16+00:00","dateModified":"2025-06-14T00:23:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/"},"wordCount":1324,"commentCount":3,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Core","Data structures"],"articleSection":[".NET","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/","url":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/","name":"Introducing Couchbase .NET 2.4.0 - .NET Core GA - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-02-17T00:38:16+00:00","dateModified":"2025-06-14T00:23:33+00:00","description":"Apresentamos o Couchbase .NET SDK para Microsoft Core e Full Framework. Incluindo suporte para estruturas de dados, N1QL e API View Streaming e MS Logging.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/#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\/introducing-couchbase-net-2-4-0-net-core-ga\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Introducing Couchbase .NET 2.4.0 &#8211; .NET Core GA"}]},{"@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\/b678bdd9f7b21a33d43ea965865a3341","name":"Jeff Morris, engenheiro de software s\u00eanior, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/73188ee2831025d81740e12e1ed80812","url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","caption":"Jeff Morris, Senior Software Engineer, Couchbase"},"description":"Jeff Morris \u00e9 engenheiro de software s\u00eanior da Couchbase. Antes de ingressar na Couchbase, Jeff passou seis anos na Source Interlink como arquiteto da Web corporativa. Jeff \u00e9 respons\u00e1vel pelo desenvolvimento dos SDKs do Couchbase e pela integra\u00e7\u00e3o com o N1QL (linguagem de consulta).","sameAs":["https:\/\/x.com\/jeffrysmorris"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/jeff-morris\/"}]}},"authors":[{"term_id":8970,"user_id":21,"is_guest":0,"slug":"jeff-morris","display_name":"Jeff Morris, Senior Software Engineer, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/5f910befdbd58de8bac85293df7f544680843061ecc921ba7d293d6d52076ab3?s=96&d=mm&r=g","author_category":"","last_name":"Jeff Morris, Senior Software Engineer, Couchbase","first_name":"Jeff","job_title":"","user_url":"","description":"Jeff Morris \u00e9 engenheiro de software s\u00eanior da Couchbase. Antes de ingressar na Couchbase, Jeff passou seis anos na Source Interlink como arquiteto da Web corporativa. Jeff \u00e9 respons\u00e1vel pelo desenvolvimento dos SDKs do Couchbase e pela integra\u00e7\u00e3o com o N1QL (linguagem de consulta)."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2733","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\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2733"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2733\/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=2733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2733"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}