{"id":1849,"date":"2014-12-24T00:21:51","date_gmt":"2014-12-24T00:21:51","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1849"},"modified":"2025-06-13T23:49:57","modified_gmt":"2025-06-14T06:49:57","slug":"couchbase-net-sdk-20-ga-available","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/","title":{"rendered":"Couchbase .NET SDK 2.0 GA Available!"},"content":{"rendered":"<p>Today we are releasing the new Couchbase .NET SDK for General Availability! This is a complete rewrite of the SDK and is based off of the Couchbase SDK 2.0 Specification, meaning it maintains a consistent interface with all of the other Couchbase 2.0 SDK\u2019s and it shares common transcoding and flags for interacting with the other SDKs. For example,\u00a0 the .NET and Java SDK\u2019s can work with the same data within the same bucket without causing transcoding issues.<\/p>\n<p style=\"text-align: center\"><img decoding=\"async\" src=\"\/wp-content\/original-assets\/couchbase-net-sdk-20-ga-available\/sdk2_0.jpg\" \/><\/p>\n<h2><\/h2>\n<h2>What\u2019s in this release?<\/h2>\n<p>This release includes all of the features added in Developer Previews <strong><a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-developer-preview-1\/\">1<\/a><\/strong>, <strong>2<\/strong> and <strong><a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-developer-preview-3\/\">3<\/a><\/strong> and Beta\u2019s <strong><a href=\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta\/\">1<\/a><\/strong> and <strong><a href=\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/\">2<\/a><\/strong>:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/\" target=\"_blank\" rel=\"noopener noreferrer\">Asynchronous Views<\/a><\/li>\n<li>Preview Support for N1QL Ad-Hoc Queries<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/\" target=\"_blank\" rel=\"noopener noreferrer\">Common Flags<\/a> &#8211; Consistent data types across SDKs<\/li>\n<li>All new <a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-developer-preview-3\/\" target=\"_blank\" rel=\"noopener noreferrer\">Document API<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/\" target=\"_blank\" rel=\"noopener noreferrer\">Bulk Insert and Get Methods<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/introducing-couchbase-net-sdk-20-beta-2\/\" target=\"_blank\" rel=\"noopener noreferrer\">All new Management API<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-net-2-0-sdk-developer-preview-2\/\">Support for Secure Socket Layers (SSL\/TLS)<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-development-series-part-1-1-server-configuration\/\" target=\"_blank\" rel=\"noopener noreferrer\">\u201cOptimized Connection Management\u201d<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-net-2-0-sdk-developer-preview-2\/\">CRAM-MD5 Authentication<\/a><\/li>\n<li>And others\u2026<\/li>\n<\/ul>\n<p>In addition to all of that, it adds the following features:<\/p>\n<ul>\n<li>Replica Read Support<\/li>\n<li>Support for GetL, Unlock and GetWithLock<\/li>\n<li>Overloads for Prepend\/Append that accepts byte arrays<\/li>\n<li>Improvements to the View API that make serializing to and from POCOs easier<\/li>\n<\/ul>\n<p>Most importantly, it includes a long list of bug fixes and improvements aimed at stabilizing the core and preparing it for production use.<\/p>\n<h3>Replica Reads<\/h3>\n<p>Replica Reads allow for reads against one or more replicas if your bucket is configured to support replicas. This is a useful for scenarios where the cluster is in an unhealthy state &#8211; for instance,\u00a0 a node is down and it has not yet been failed over.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace\">\n<p><span style=\"color: #0600ff;font-weight: bold\">using<\/span> <span style=\"color: #008000\">(<\/span>var cluster <span style=\"color: #008000\">=<\/span> <a href=\"https:\/\/www.google.com\/search?q=new+msdn.microsoft.com\"><span style=\"color: #008000\">new<\/span><\/a> Cluster<span style=\"color: #008000\">(<\/span>config<span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">)<\/span><br \/>\n<span style=\"color: #008000\">{<\/span><br \/>\n<span style=\"color: #0600ff;font-weight: bold\">using<\/span> <span style=\"color: #008000\">(<\/span>var bucket <span style=\"color: #008000\">=<\/span> cluster<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">OpenBucket<\/span><span style=\"color: #008000\">(<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">)<\/span><br \/>\n<span style=\"color: #008000\">{<\/span><br \/>\n<span style=\"color: #0600ff;font-weight: bold\">const<\/span> <span style=\"color: #6666cc;font-weight: bold\">string<\/span> key <span style=\"color: #008000\">=<\/span> <span style=\"color: #666666\">&#8220;ReplicaKey&#8221;<\/span><span style=\"color: #008000\">;<\/span><\/p>\n<p>var result <span style=\"color: #008000\">=<\/span> bucket<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">GetFromReplica<\/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>key<span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">;<\/span><br \/>\nAssert<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">IsTrue<\/span><span style=\"color: #008000\">(<\/span>result<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Success<\/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<\/div>\n<\/div>\n<p>In the code above, were simply replacing the usual Get(key) method, which retrieves the key directly from the primary, with the GetFromReplica(key) method, which will attempt to retrieve the key from one or more replicas. Note that Couchbase Server supports up to\u00a0 three replicas and the number of nodes in your cluster must match the number of replicas (or copies) you wish to store.<\/p>\n<h3>GetL, Unlock and GetWithLock<\/h3>\n<p>GetL is the memcached command for locking a key for exclusive use. By default, the server will lock a key for 15 seconds and up to a maximum of 30 seconds. In the SDK, we provide a method called GetWithLock which encapsulates this behavior. The UnLock method allows for explicit removal of a lock on a key, before the expiration expires or when the server unlocks the key once the maximum expiry of the 30 seconds has been reached.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace\">\n<p><span style=\"color: #0600ff;font-weight: bold\">using<\/span> <span style=\"color: #008000\">(<\/span>var bucket <span style=\"color: #008000\">=<\/span> _cluster<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">OpenBucket<\/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 key <span style=\"color: #008000\">=<\/span> <span style=\"color: #666666\">&#8220;When_Key_Is_Locked_Mutate_Succeeds_If_Unlocked&#8221;<\/span><span style=\"color: #008000\">;<\/span><br \/>\nAssert<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">IsTrue<\/span><span style=\"color: #008000\">(<\/span>bucket<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Upsert<\/span><span style=\"color: #008000\">(<\/span>key, <span style=\"color: #666666\">&#8220;{&#8216;name&#8217;:&#8217;value&#8217;}&#8221;<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Success<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">;<\/span><\/p>\n<p>var getl <span style=\"color: #008000\">=<\/span> bucket<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">GetWithLock<\/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>key, <span style=\"color: #ff0000\">15<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">;<\/span><br \/>\nAssert<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">IsTrue<\/span><span style=\"color: #008000\">(<\/span>getl<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Success<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">;<\/span> <span style=\"color: #008080;font-style: italic\">\/\/will succeed<\/span><\/p>\n<p>var unlock <span style=\"color: #008000\">=<\/span> bucket<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Unlock<\/span><span style=\"color: #008000\">(<\/span>key, getl<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Cas<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">;<\/span><br \/>\nAssert<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">IsTrue<\/span><span style=\"color: #008000\">(<\/span>unlock<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Success<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">;<\/span><\/p>\n<p>var upsert <span style=\"color: #008000\">=<\/span> bucket<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Upsert<\/span><span style=\"color: #008000\">(<\/span>key, <span style=\"color: #666666\">&#8220;{&#8216;name&#8217;:&#8217;value2&#8242;}&#8221;<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">;<\/span><br \/>\nAssert<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">IsTrue<\/span><span style=\"color: #008000\">(<\/span>upsert<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Success<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">;<\/span><br \/>\n<span style=\"color: #008000\">}<\/span><\/p>\n<\/div>\n<\/div>\n<p>In the example above, we insert or update a key using the Upsert method, then lock the key for 15 seconds, before unlocking it and finally performing another mutation on it. If we had not used the Unlock method, the final Upsert method would have failed with a &#8220;KeyExists&#8221; status.<\/p>\n<h3>View Improvements<\/h3>\n<p>The View API has been improved to make it easier to use POCO (plain ole\u2019 csharp objects) as the target of a view request.<\/p>\n<div class=\"geshifilter\">\n<div class=\"csharp geshifilter-csharp\" style=\"font-family: monospace\">\n<p><span style=\"color: #0600ff;font-weight: bold\">using<\/span> <span style=\"color: #008000\">(<\/span>var bucket <span style=\"color: #008000\">=<\/span> _cluster<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">OpenBucket<\/span><span style=\"color: #008000\">(<\/span><span style=\"color: #666666\">&#8220;beer-sample&#8221;<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">)<\/span><br \/>\n<span style=\"color: #008000\">{<\/span><br \/>\nvar query <span style=\"color: #008000\">=<\/span> bucket<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">CreateQuery<\/span><span style=\"color: #008000\">(<\/span><span style=\"color: #666666\">&#8220;beer&#8221;<\/span>, <span style=\"color: #666666\">&#8220;all_beers&#8221;<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Limit<\/span><span style=\"color: #008000\">(<\/span><span style=\"color: #ff0000\">10<\/span><span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">;<\/span><br \/>\nvar result <span style=\"color: #008000\">=<\/span> bucket<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Query<\/span><span style=\"color: #008000\">&lt;<\/span>Beer<span style=\"color: #008000\">&gt;<\/span><span style=\"color: #008000\">(<\/span>query<span style=\"color: #008000\">)<\/span><span style=\"color: #008000\">;<\/span><\/p>\n<p><span style=\"color: #0600ff;font-weight: bold\">foreach<\/span> <span style=\"color: #008000\">(<\/span>var beer <span style=\"color: #0600ff;font-weight: bold\">in<\/span> result<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Values<\/span><span style=\"color: #008000\">)<\/span><br \/>\n<span style=\"color: #008000\">{<\/span><br \/>\nConsole<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">WriteLine<\/span><span style=\"color: #008000\">(<\/span><span style=\"color: #666666\">&#8220;{0} has {1} abv.&#8221;<\/span>, beer<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Name<\/span>, beer<span style=\"color: #008000\">.<\/span><span style=\"color: #0000ff\">Abv<\/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>And the output<span style=\"color: #008000\">:<\/span><br \/>\n<span style=\"color: #008000\">&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<\/span><br \/>\n21A IPA has <span style=\"color: #ff0000\">7.2<\/span> abv<span style=\"color: #008000\">.<\/span><br \/>\n<span style=\"color: #ff0000\">563<\/span> Stout has <span style=\"color: #ff0000\">5<\/span> abv<span style=\"color: #008000\">.<\/span><br \/>\n<span style=\"color: #0000ff\">Amendment<\/span> Pale Ale has <span style=\"color: #ff0000\">5.2<\/span> abv<span style=\"color: #008000\">.<\/span><br \/>\n<span style=\"color: #0000ff\">Bitter<\/span> American has <span style=\"color: #ff0000\">3.6<\/span> abv<span style=\"color: #008000\">.<\/span><br \/>\n<span style=\"color: #6666cc;font-weight: bold\">Double<\/span> Trouble IPA has <span style=\"color: #ff0000\">9.8<\/span> abv<span style=\"color: #008000\">.<\/span><br \/>\n<span style=\"color: #0000ff\">General<\/span> Pippo<span style=\"color: #666666\">&#8216;s Porter has 5.5 abv.<br \/>\nNorth Star Red has 5.8 abv.<br \/>\nOyster Point Oyster Stout has 5.9 abv.<br \/>\nPotrero ESB has 5.2 abv.<br \/>\nSouth Park Blonde has 5 abv.<\/span><\/p>\n<\/div>\n<\/div>\n<p>The big difference is that the results of the view, the value portion, will be serialized into a list with the value hydrating the POCO. Note that the id and key field is ignored in this list, however their is still a Rows property available that allows you to get this information.<\/p>\n<h2>What\u2019s Changed?<\/h2>\n<p>While we have tried to keep from breaking any interfaces already published in the previous Beta release, there are a couple of changes that were made because they make for a better final API:<\/p>\n<ul>\n<li>The IDocumentResult interface and implementations have changed: the Value property has been renamed to Content. This was done to make it more consistent with the Java SDK. Note that the return value for the non-document methods is still Value.<\/li>\n<li>The ICluster interface has been made public (from internal) so that it\u2019s easier to mock and test against<\/li>\n<\/ul>\n<h2>What\u2019s not in this release?<\/h2>\n<p>The major missing feature is support for asynchronous operations using the TAP (Task Asynchrony Pattern) keywords async and await. This feature is in progress, but is simply not ready for prime time. Expect something later this year or early next.<\/p>\n<h2>How to get it?<\/h2>\n<p>Like all releases, the GA is available from NuGet as a package, as a direct download of the binaries from S3, and the source, as always, is available on GitHub:<\/p>\n<ul>\n<li>Binaries are <a style=\"color: #007da4;text-decoration: none;line-height: inherit\" href=\"https:\/\/packages.couchbase.com.s3.amazonaws.com\/clients\/net\/2.0\/Couchbase-Net-Client-2.0.0%2B1.zip\">here.<\/a><\/li>\n<li>The repo is <a style=\"color: #007da4;text-decoration: none;line-height: inherit\" href=\"https:\/\/github.com\/couchbase\/couchbase-net-client\">here<\/a>.<\/li>\n<li>The NuGet packages are <a style=\"color: #007da4;text-decoration: none;line-height: inherit\" href=\"https:\/\/www.nuget.org\/packages\/CouchbaseNetClient\/2.0.0.1\">here<\/a>.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Today we are releasing the new Couchbase .NET SDK for General Availability! This is a complete rewrite of the SDK and is based off of the Couchbase SDK 2.0 Specification, meaning it maintains a consistent interface with all of the [&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,10127],"tags":[],"ppma_author":[8970],"class_list":["post-1849","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-c-sharp"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Couchbase .NET SDK 2.0 GA Available! - 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\/couchbase-net-sdk-20-ga-available\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couchbase .NET SDK 2.0 GA Available!\" \/>\n<meta property=\"og:description\" content=\"Today we are releasing the new Couchbase .NET SDK for General Availability! This is a complete rewrite of the SDK and is based off of the Couchbase SDK 2.0 Specification, meaning it maintains a consistent interface with all of the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-24T00:21:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:49:57+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=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/\"},\"author\":{\"name\":\"Jeff Morris, Senior Software Engineer, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341\"},\"headline\":\"Couchbase .NET SDK 2.0 GA Available!\",\"datePublished\":\"2014-12-24T00:21:51+00:00\",\"dateModified\":\"2025-06-14T06:49:57+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/\"},\"wordCount\":894,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\".NET\",\"C#\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/\",\"name\":\"Couchbase .NET SDK 2.0 GA Available! - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-24T00:21:51+00:00\",\"dateModified\":\"2025-06-14T06:49:57+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#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\/couchbase-net-sdk-20-ga-available\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couchbase .NET SDK 2.0 GA Available!\"}]},{\"@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":"Couchbase .NET SDK 2.0 GA Available! - 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\/couchbase-net-sdk-20-ga-available\/","og_locale":"en_US","og_type":"article","og_title":"Couchbase .NET SDK 2.0 GA Available!","og_description":"Today we are releasing the new Couchbase .NET SDK for General Availability! This is a complete rewrite of the SDK and is based off of the Couchbase SDK 2.0 Specification, meaning it maintains a consistent interface with all of the [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-24T00:21:51+00:00","article_modified_time":"2025-06-14T06:49:57+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":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/"},"author":{"name":"Jeff Morris, Senior Software Engineer, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/b678bdd9f7b21a33d43ea965865a3341"},"headline":"Couchbase .NET SDK 2.0 GA Available!","datePublished":"2014-12-24T00:21:51+00:00","dateModified":"2025-06-14T06:49:57+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/"},"wordCount":894,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":[".NET","C#"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/","url":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/","name":"Couchbase .NET SDK 2.0 GA Available! - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-24T00:21:51+00:00","dateModified":"2025-06-14T06:49:57+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/couchbase-net-sdk-20-ga-available\/#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\/couchbase-net-sdk-20-ga-available\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Couchbase .NET SDK 2.0 GA Available!"}]},{"@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\/1849","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=1849"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/1849\/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=1849"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=1849"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=1849"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=1849"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}