{"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\/introducing-couchbase-net-2-4-0-net-core-ga\/","title":{"rendered":"Introducing Couchbase .NET 2.4.0 &#8211; .NET Core GA"},"content":{"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<em>&#8220;.NET Core is a blazing fast, lightweight and modular platform for creating web applications and services that run on Windows, Linux and Mac&#8221;<\/em><\/p>\n<p>Wait a minute&#8230;read that again:\u00a0<em>&#8220;.NET Core is a blazing fast, lightweight and modular platform for creating web applications and services that\u00a0<\/em><strong>run on Windows, Linux and Mac<\/strong><em>&#8220;<\/em>. Microsoft .NET applications running on OSX and Linux? What kind of bizzaro world are we living in? It\u2019s the &#8220;New&#8221; Microsoft for sure!<\/p>\n<p>In this blog post, I&#8217;ll go over what is in the 2.4.0 release, changes to packaging (NuGet), and what version of .NET the SDK supports. We\u2019ll also demonstrate some of the new features such as Datastructures.<\/p>\n<p><strong>What&#8217;s in this release?<\/strong><\/p>\n<p>2.4.0 is a large release with over 30 commits. When you consider that we released 3 Developer Previews leading up to 2.4.0, there are actually many, many more commits leading up to this release over the last 6 months. Here is an overview of some of the more impressive features &#8211; you can see all of the commits in the &#8220;Release Notes&#8221; section below:<\/p>\n<p><strong>.NET Core Support<\/strong><\/p>\n<p>Of course the most significant feature of 2.4.0 is .NET Core support, which from the opening paragraph, means you can now develop on Mac OS or Windows and deploy to Linux (or vice-versa, but the tooling is a bit immature still). This is great stuff and a major change for the traditional Windows developer.<\/p>\n<p>If you\u2019re unaware of .NET Core, you can read up more about it over on the\u00a0<a href=\"https:\/\/dotnet.github.io\/\">.NET Core website<\/a>. One cool thing about it is that it\u2019s open source (Apache 2.0) and source is all available on Github.<\/p>\n<p>The Couchbase SDK specifically supports the\u00a0netstandard1.5\u00a0or greater. We tested the SDK using\u00a01.0.0-preview2-1-003177\u00a0of the Command Line Tools.<\/p>\n<p><strong>Packaging changes<\/strong><\/p>\n<p>Just like the three developer previews, the NuGet package will contain binaries for both the .NET Full Framework (targeting .NET 4.5 or greater), but also for .NET Core (targeting .NET Core 1.1). Depending on the target project you are including the dependency for, the correct binaries will be used.<\/p>\n<p>So, if your Visual Studio project is a .NET Full Framework application greater than or equal to 4.5, you&#8217;ll get the binaries for the full framework version of .NET. Likewise, if your application is a .NET Core application, then the .NET Core version of the binaries will be used. There should be nothing you have to do to enable this.<\/p>\n<p>The older .NET 4.5 version of the packages will no longer be released; 2.3.11 is the last supported release of the 2.3.X series.<\/p>\n<p><strong>MS Logging for Core<\/strong><\/p>\n<p>For .NET Core we decided to change from using\u00a0<a href=\"https:\/\/github.com\/net-commons\/common-logging\">Common.Logging<\/a>\u00a0to MS Logging mainly because no 3rd party (<a href=\"https:\/\/logging.apache.org\/log4net\/\">log4net<\/a>\u00a0for example) have stable support for .NET Core at this time.<\/p>\n<p>Additionally, by moving from <span class=\"lang:default decode:true crayon-inline \">Common.Logging<\/span>\u00a0 to MS Logging we have removed one more 3rd party dependency &#8211; which is always nice. Not that Common.Logging wasn&#8217;t sufficient, but it makes more sense to use a dependency from Microsoft.<\/p>\n<p>Here is an example of configuring the 2.4.0 client targeting .NET Core and using NLog:<\/p>\n<p>First add the dependencies to the 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>Then, add a\u00a0nlog.config\u00a0file to your project with the following contents:<\/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 \">Finally, add the code to configure the Couchbase SDK for logging:<\/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>Note that the project.json has a <span class=\"lang:default decode:true crayon-inline \">copyToOutput.include<\/span>\u00a0 value for <span class=\"lang:default decode:true crayon-inline \">nlog.config<\/span>\u00a0. This is required so the tooling will copy that file to the output directory when built.<\/p>\n<p>Now for the .NET 4.5 Full Framework binaries, the dependency on <span class=\"lang:default decode:true crayon-inline \">Common.Logging <\/span>\u00a0remains and any existing logging configuration should work as it always has.<\/p>\n<p><strong>Datastructures<\/strong><\/p>\n<p>Datastructures are a new way of working with Couchbase documents as if they are a common Computer Science data structures such as\u00a0<em>lists<\/em>,\u00a0<em>queues<\/em>,\u00a0<em>dictionaries<\/em>\u00a0or\u00a0<em>sets<\/em>. There are two implementations in the SDK; one as a series of methods on <span class=\"lang:default decode:true crayon-inline \">CouchbaseBucket<\/span>\u00a0 which provide functionality for common data structure operations and another as implementations of the interfaces within <span class=\"lang:default decode:true crayon-inline \">System.Collections.Generics<\/span>\u00a0. Here is a description of each Datastructure class found in the SDK:<\/p>\n<ul>\n<li><span class=\"lang:default decode:true crayon-inline \">CouchbaseDictionary&lt;TKey, TValue&gt;<\/span>\u00a0: Represents a collection of keys and values stored within a Couchbase Document.<\/li>\n<li><span class=\"lang:default decode:true crayon-inline \">CouchbaseList&lt;T&gt;<\/span>\u00a0: Represents a collection of objects, stored in Couchbase server, that can be individually accessed by index.<\/li>\n<li><span class=\"lang:c# decode:true crayon-inline \">CouchbaseQueue&lt;T&gt;<\/span>\u00a0: Provides a persistent Couchbase data structure with FIFO behavior.<\/li>\n<li><span class=\"lang:c# decode:true crayon-inline \">CouchbaseSet&lt;T&gt;<\/span>\u00a0: Provides a Couchbase persisted set, which is a collection of objects with no duplicates.<\/li>\n<\/ul>\n<p>All of these classes are found in the <span class=\"lang:default decode:true crayon-inline \">Couchbase.Collections<\/span>\u00a0 namespace. Here is an example of using a <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>Multiplexing IO<\/strong><\/p>\n<p>The Couchbase SDK has used connection pooling in the past to allow high throughput and scale at the cost of latency and resource utilization. In Couchbase\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-.net-sdk-2.2.4-now-available\/\">2.2.4<\/a>\u00a0we introduced a better IO model call Multiplexing IO or MUX-IO, which the client could be configured to use (the default was pooled connections).<\/p>\n<p>In 2.4.0 we are making MUX-IO the default IO model and making connection pooling optional. What this means to you is that some connection pooling properties in your configuration may still be used\u00a0SDK. For example:<\/p>\n<ul>\n<li><span class=\"lang:default decode:true crayon-inline \">PoolConfiguration.MaxSize<\/span>\u00a0 is still used but should be relatively small values &#8211; e.g. 5-10<\/li>\n<li><span class=\"lang:default decode:true crayon-inline\">PoolConfiguration.MinSize <\/span>\u00a0should be 0 or 1<\/li>\n<\/ul>\n<p>To disable MUX-IO it\u2019s simply a matter of setting the\u00a0<span class=\"lang:default decode:true crayon-inline\">ClientConfiguration.UseConnectionPooling<\/span>to true (the default is false) to use connection pooling:<\/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>Streaming N1QL and Views<\/strong><\/p>\n<p>Streaming N1QL and Views are a performance optimization in certain cases where the amount of data retrieved is large. To understand why, let\u2019s consider how non-streaming queries work:<\/p>\n<ol>\n<li>A request is dispatched to the server.<\/li>\n<li>The server does it&#8217;s processing and returns back the results as a stream after processing the entire response.<\/li>\n<li>The client buffers the entire stream and then de-serializes the stream into a collection of type &#8220;T&#8221;, where T is the POCO that each result is mapped to.<\/li>\n<li>The server returns back the list to the application within its <span class=\"lang:default decode:true crayon-inline \">IResult<\/span><\/li>\n<\/ol>\n<p>What can go wrong here? Think about very large results and that memory resources are finite: eventually you will always encounter an <span class=\"lang:default decode:true crayon-inline \">OutOfMemoryException<\/span>\u00a0! There are other side effects as well related to Garbage Collection.<\/p>\n<p>With streaming clients the process is as follows:<\/p>\n<ol>\n<li>A request is dispatched to the server<\/li>\n<li>The server does it&#8217;s processing and returns back the results as a stream as soon as the response headers are available.<\/li>\n<li>The client partially reads the headers and meta-data and then pauses until iteration occurs.<\/li>\n<li>When the application starts iterating over the <span class=\"lang:default decode:true crayon-inline \">IResult<\/span>\u00a0, each item is read one at a time without storing in an underlying collection.<\/li>\n<\/ol>\n<p>The big benefit here is that the working set of memory will not grow as the collection grows and internally re-sized by .NET. Instead, you have a fixed working size of memory and GC can occur as soon as the read object is discarded.<\/p>\n<p>To use streaming N1QL and views, all that you do is call the <span class=\"lang:default decode:true crayon-inline\">UseStreaming()<\/span>\u00a0method and pass in true to stream:<\/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>Passing in false will mean that the entire response is buffered and processed before returning.<\/p>\n<p><strong>N1QL Query Cancellation<\/strong><\/p>\n<p>This feature allows long running N1QL queries to be canceled before they complete using task cancellation tokens. For example:<\/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>This commit was via a community contribution from\u00a0<a href=\"https:\/\/github.com\/brantburnett\">Brant Burnett<\/a>\u00a0of<a href=\"https:\/\/centeredgesoftware.com\/\">\u00a0CenteredgeSoftware.com<\/a>!<\/p>\n<p><strong>Important TLS\/SSL Note on Linux<\/strong><\/p>\n<p>There is one issue on Linux that you may come across if you are using SSL: a\u00a0PlatformNotSupportedException\u00a0will be thrown if you have a version of libcurl installed on the server &lt; 7.30.0. The work-around is to simply upgrade your libcurl installation on Linux to something equal to or greater than 7.30.0. You can read more about this on the Jira ticket:\u00a0<a href=\"https:\/\/issues.couchbase.com\/browse\/NCBC-1296\">NCBC-1296<\/a>.<\/p>\n<p>&nbsp;<\/p>\n","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>\n","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 v25.7.1 (Yoast SEO v25.7) - 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\/introducing-couchbase-net-2-4-0-net-core-ga\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\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\/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 minutes\" \/>\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\":\"en-US\",\"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\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@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\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@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\":\"en-US\",\"@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\/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":"Introducing the Couchbase .NET SDK for Microsoft Core and Full Framework. Including support for Datastructures, N1QL and View Streaming API and 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\/introducing-couchbase-net-2-4-0-net-core-ga\/","og_locale":"en_US","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\/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 minutes"},"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":"en-US","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":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-2-4-0-net-core-ga\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@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":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@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":"en-US","@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\/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 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)."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2733","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=2733"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2733\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=2733"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=2733"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=2733"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=2733"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}