Added: websites/staging/thrift/trunk/content/tutorial/netstd.html
==============================================================================
--- websites/staging/thrift/trunk/content/tutorial/netstd.html (added)
+++ websites/staging/thrift/trunk/content/tutorial/netstd.html Tue Jan 29 
22:05:08 2019
@@ -0,0 +1,932 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" 
rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+         <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+       
+    <title>Apache Thrift - .NET Standard</title>
+  </head>
+  <body>
+       <div class="navbar">
+       <div class="navbar-inner">
+               <div class="container">
+                       <a class="brand" href="/">Apache Thrift &trade;</a>
+                       <div class="nav-collapse">
+                               <ul class="nav pull-right">
+                                       <li>
+                                               <a href="/download">Download</a>
+                                       </li>
+                                       <li>
+                                               <a 
href="/docs">Documentation</a>
+                                       </li>
+                                       <li>
+                                               <a 
href="/developers">Developers</a>
+                                       </li>
+                                       <li>
+                                               <a href="/lib">Libraries</a>
+                                       </li>
+                                       <li>
+                                               <a href="/tutorial">Tutorial</a>
+                                       </li>
+                                       <li>
+                                               <a href="/test">Test Suite</a>
+                                       </li>
+                                       <li>
+                                               <a href="/about">About</a>
+                                       </li>
+                                       <li class="dropdown">
+                                               <a href="#" 
class="dropdown-toggle" data-toggle="dropdown">
+                                                       Apache <b 
class="caret"></b>
+                                               </a>
+                                               <ul class="dropdown-menu">
+                                                       <li>
+                                                               <a 
href="http://www.apache.org/"; target="_blank">Apache Home</a>
+                                                       </li>
+                                                       <li>
+                                                               <a 
href="http://www.apache.org/licenses/"; target="_blank">Apache License v2.0</a>
+                                                       </li>
+                                                       <li>
+                                                               <a 
href="http://www.apache.org/foundation/sponsorship.html"; 
target="_blank">Donate</a>
+                                                       </li>
+                                                       <li>
+                                                               <a 
href="http://www.apache.org/foundation/thanks.html"; target="_blank">Thanks</a>
+                                                       </li>
+                                                       <li>
+                                                               <a 
href="http://www.apache.org/security/"; target="_blank">Security</a>
+                                                       </li>
+                                               </ul>
+                                       </li>
+                               </ul>
+                       </div>
+               </div>
+       </div>
+</div>
+
+       <div class="container">
+          <style type="text/css">
+/* The following code is added by mdx_elementid.py
+   It was originally lifted from http://subversion.apache.org/style/site.css */
+/*
+ * Hide class="elementid-permalink", except when an enclosing heading
+ * has the :hover property.
+ */
+.headerlink, .elementid-permalink {
+  visibility: hidden;
+}
+h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, 
h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, 
dt:hover > .elementid-permalink { visibility: visible }</style>
+<h2 id="net-standard-tutorial">.NET Standard Tutorial<a class="headerlink" 
href="#net-standard-tutorial" title="Permanent link">&para;</a></h2>
+<hr />
+<h3 id="introduction">Introduction<a class="headerlink" href="#introduction" 
title="Permanent link">&para;</a></h3>
+<p>All Apache Thrift tutorials require that you have:</p>
+<ol>
+<li>The Apache Thrift Compiler and Libraries, see <a 
href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building 
from Source</a> for more details.</li>
+<li>
+<p>Generated the <a 
href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift";>tutorial.thrift</a>
 and <a 
href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift";>shared.thrift</a>
 files:</p>
+<div class="codehilite"><pre><span class="n">thrift</span> <span 
class="o">-</span><span class="n">r</span> <span class="o">--</span><span 
class="n">gen</span> <span class="n">netstd</span> <span 
class="n">tutorial</span><span class="p">.</span><span class="n">thrift</span>
+</pre></div>
+
+
+</li>
+<li>
+<p>Followed all prerequisites listed below.</p>
+</li>
+</ol>
+<h3 id="prerequisites">Prerequisites<a class="headerlink" 
href="#prerequisites" title="Permanent link">&para;</a></h3>
+<h3 id="client">Client<a class="headerlink" href="#client" title="Permanent 
link">&para;</a></h3>
+<style type="text/css">
+/* The following code is added by mdx_elementid.py
+   It was originally lifted from http://subversion.apache.org/style/site.css */
+/*
+ * Hide class="elementid-permalink", except when an enclosing heading
+ * has the :hover property.
+ */
+.headerlink, .elementid-permalink {
+  visibility: hidden;
+}
+h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, 
h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, 
dt:hover > .elementid-permalink { visibility: visible }</style>
+
+<div class="codehilite"><pre><span class="k">using</span> <span 
class="n">System</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Collections</span><span 
class="p">.</span><span class="n">Generic</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">IO</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Linq</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Net</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Net</span><span class="p">.</span><span 
class="n">Security</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Security</span><span class="p">.</span><span 
class="n">Cryptography</span><span class="p">.</span><span 
class="n">X509Certificates</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Threading</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Threading</span><span class="p">.</span><span 
class="n">Tasks</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span 
class="p">.</span><span class="n">Extensions</span><span 
class="p">.</span><span class="n">Logging</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span 
class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span 
class="p">.</span><span class="n">Protocol</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span 
class="p">.</span><span class="n">Transport</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span 
class="p">.</span><span class="n">Transport</span><span class="p">.</span><span 
class="n">Client</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">tutorial</span><span 
class="p">;</span>
+<span class="k">using</span> <span class="n">shared</span><span 
class="p">;</span>
+
+<span class="k">namespace</span> <span class="n">Client</span>
+<span class="p">{</span>
+    <span class="k">public</span> <span class="k">class</span> <span 
class="nc">Program</span>
+    <span class="p">{</span>
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">readonly</span> <span class="n">ILogger</span> <span 
class="n">Logger</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">LoggerFactory</span><span class="p">().</span><span 
class="n">AddConsole</span><span class="p">().</span><span 
class="n">AddDebug</span><span class="p">().</span><span 
class="n">CreateLogger</span><span class="p">(</span><span 
class="n">nameof</span><span class="p">(</span><span 
class="n">Client</span><span class="p">));</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="kt">void</span> <span class="n">DisplayHelp</span><span 
class="p">()</span>
+        <span class="p">{</span>
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">@</span><span class="s">&quot;</span>
+<span class="nl">Usage:</span> 
+    <span class="n">Client</span><span class="p">.</span><span 
class="n">exe</span> <span class="o">-</span><span class="n">help</span>
+        <span class="n">will</span> <span class="n">diplay</span> <span 
class="n">help</span> <span class="n">information</span>
+
+    <span class="n">Client</span><span class="p">.</span><span 
class="n">exe</span> <span class="o">-</span><span class="nl">tr:</span><span 
class="o">&lt;</span><span class="n">transport</span><span 
class="o">&gt;</span> <span class="o">-</span><span class="nl">pr:</span><span 
class="o">&lt;</span><span class="n">protocol</span><span class="o">&gt;</span> 
<span class="o">-</span><span class="nl">mc:</span><span 
class="o">&lt;</span><span class="n">numClients</span><span 
class="o">&gt;</span>
+        <span class="n">will</span> <span class="n">run</span> <span 
class="n">client</span> <span class="n">with</span> <span 
class="n">specified</span> <span class="n">arguments</span> <span 
class="p">(</span><span class="n">tcp</span> <span class="n">transport</span> 
<span class="n">and</span> <span class="n">binary</span> <span 
class="n">protocol</span> <span class="n">by</span> <span 
class="k">default</span><span class="p">)</span> <span class="n">and</span> 
<span class="n">with</span> <span class="mi">1</span> <span 
class="n">client</span>
+
+<span class="nl">Options:</span>
+    <span class="o">-</span><span class="n">tr</span> <span 
class="p">(</span><span class="n">transport</span><span class="p">)</span><span 
class="o">:</span> 
+        <span class="n">tcp</span> <span class="o">-</span> <span 
class="p">(</span><span class="k">default</span><span class="p">)</span> <span 
class="n">tcp</span> <span class="n">transport</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span> 
<span class="p">(</span><span class="n">host</span> <span class="o">-</span> 
<span class="s">&quot;&quot;</span><span class="n">localhost</span><span 
class="s">&quot;&quot;</span><span class="p">,</span> <span 
class="n">port</span> <span class="o">-</span> <span 
class="mi">9090</span><span class="p">)</span>
+        <span class="n">tcpbuffered</span> <span class="o">-</span> <span 
class="n">buffered</span> <span class="n">transport</span> <span 
class="n">over</span> <span class="n">tcp</span> <span class="n">will</span> 
<span class="n">be</span> <span class="n">used</span> <span 
class="p">(</span><span class="n">host</span> <span class="o">-</span> <span 
class="s">&quot;&quot;</span><span class="n">localhost</span><span 
class="s">&quot;&quot;</span><span class="p">,</span> <span 
class="n">port</span> <span class="o">-</span> <span 
class="mi">9090</span><span class="p">)</span>
+        <span class="n">namedpipe</span> <span class="o">-</span> <span 
class="n">namedpipe</span> <span class="n">transport</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span> 
<span class="p">(</span><span class="n">pipe</span> <span 
class="n">address</span> <span class="o">-</span> <span 
class="s">&quot;&quot;</span><span class="p">.</span><span 
class="n">test</span><span class="s">&quot;&quot;</span><span class="p">)</span>
+        <span class="n">http</span> <span class="o">-</span> <span 
class="n">http</span> <span class="n">transport</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span> 
<span class="p">(</span><span class="n">address</span> <span class="o">-</span> 
<span class="s">&quot;&quot;</span><span class="nl">http:</span><span 
class="c1">//localhost:9090&quot;&quot;)        </span>
+        <span class="n">tcptls</span> <span class="o">-</span> <span 
class="n">tcp</span> <span class="n">tls</span> <span 
class="n">transport</span> <span class="n">will</span> <span 
class="n">be</span> <span class="n">used</span> <span class="p">(</span><span 
class="n">host</span> <span class="o">-</span> <span 
class="s">&quot;&quot;</span><span class="n">localhost</span><span 
class="s">&quot;&quot;</span><span class="p">,</span> <span 
class="n">port</span> <span class="o">-</span> <span 
class="mi">9090</span><span class="p">)</span>
+        <span class="n">framed</span> <span class="o">-</span> <span 
class="n">tcp</span> <span class="n">framed</span> <span 
class="n">transport</span> <span class="n">will</span> <span 
class="n">be</span> <span class="n">used</span> <span class="p">(</span><span 
class="n">host</span> <span class="o">-</span> <span 
class="s">&quot;&quot;</span><span class="n">localhost</span><span 
class="s">&quot;&quot;</span><span class="p">,</span> <span 
class="n">port</span> <span class="o">-</span> <span 
class="mi">9090</span><span class="p">)</span>
+
+    <span class="o">-</span><span class="n">pr</span> <span 
class="p">(</span><span class="n">protocol</span><span class="p">)</span><span 
class="o">:</span> 
+        <span class="n">binary</span> <span class="o">-</span> <span 
class="p">(</span><span class="k">default</span><span class="p">)</span> <span 
class="n">binary</span> <span class="n">protocol</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span>
+        <span class="n">compact</span> <span class="o">-</span> <span 
class="n">compact</span> <span class="n">protocol</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span>
+        <span class="n">json</span> <span class="o">-</span> <span 
class="n">json</span> <span class="n">protocol</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span>
+        <span class="n">multiplexed</span> <span class="o">-</span> <span 
class="n">multiplexed</span> <span class="n">protocol</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span>
+
+    <span class="o">-</span><span class="n">mc</span> <span 
class="p">(</span><span class="n">multiple</span> <span 
class="n">clients</span><span class="p">)</span><span class="o">:</span>
+        <span class="o">&lt;</span><span class="n">numClients</span><span 
class="o">&gt;</span> <span class="o">-</span> <span class="n">number</span> 
<span class="n">of</span> <span class="n">multiple</span> <span 
class="n">clients</span> <span class="n">to</span> <span 
class="n">connect</span> <span class="n">to</span> <span 
class="n">server</span> <span class="p">(</span><span class="n">max</span> 
<span class="mi">100</span><span class="p">,</span> <span 
class="k">default</span> <span class="mi">1</span><span class="p">)</span>
+
+<span class="nl">Sample:</span>
+    <span class="n">Client</span><span class="p">.</span><span 
class="n">exe</span> <span class="o">-</span><span class="nl">tr:</span><span 
class="n">tcp</span> <span class="o">-</span><span class="nl">p:</span><span 
class="n">binary</span>
+<span class="s">&quot;);</span>
+        <span class="p">}</span>
+
+        <span class="k">public</span> <span class="k">static</span> <span 
class="kt">void</span> <span class="n">Main</span><span class="p">(</span><span 
class="n">string</span><span class="p">[]</span> <span 
class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">args</span> <span class="o">=</span> <span 
class="n">args</span> <span class="o">??</span> <span class="k">new</span> 
<span class="n">string</span><span class="p">[</span><span 
class="mi">0</span><span class="p">];</span>
+
+            <span class="k">if</span> <span class="p">(</span><span 
class="n">args</span><span class="p">.</span><span class="n">Any</span><span 
class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span 
class="n">x</span><span class="p">.</span><span 
class="n">StartsWith</span><span class="p">(</span><span 
class="s">&quot;-help&quot;</span><span class="p">,</span> <span 
class="n">StringComparison</span><span class="p">.</span><span 
class="n">OrdinalIgnoreCase</span><span class="p">)))</span>
+            <span class="p">{</span>
+                <span class="n">DisplayHelp</span><span class="p">();</span>
+                <span class="k">return</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="s">&quot;Starting client...&quot;</span><span class="p">);</span>
+
+            <span class="k">using</span> <span class="p">(</span><span 
class="n">var</span> <span class="n">source</span> <span class="o">=</span> 
<span class="k">new</span> <span class="n">CancellationTokenSource</span><span 
class="p">())</span>
+            <span class="p">{</span>
+                <span class="n">RunAsync</span><span class="p">(</span><span 
class="n">args</span><span class="p">,</span> <span 
class="n">source</span><span class="p">.</span><span 
class="n">Token</span><span class="p">).</span><span 
class="n">GetAwaiter</span><span class="p">().</span><span 
class="n">GetResult</span><span class="p">();</span>
+            <span class="p">}</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">async</span> <span class="n">Task</span> <span 
class="n">RunAsync</span><span class="p">(</span><span 
class="n">string</span><span class="p">[]</span> <span 
class="n">args</span><span class="p">,</span> <span 
class="n">CancellationToken</span> <span 
class="n">cancellationToken</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">numClients</span> <span 
class="o">=</span> <span class="n">GetNumberOfClients</span><span 
class="p">(</span><span class="n">args</span><span class="p">);</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;Selected # of clients: 
{numClients}&quot;</span><span class="p">);</span>
+
+            <span class="n">var</span> <span class="n">transports</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TTransport</span><span class="p">[</span><span 
class="n">numClients</span><span class="p">];</span>
+            <span class="k">for</span> <span class="p">(</span><span 
class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span 
class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span 
class="o">&lt;</span> <span class="n">numClients</span><span class="p">;</span> 
<span class="n">i</span><span class="o">++</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">var</span> <span class="n">t</span> <span 
class="o">=</span> <span class="n">GetTransport</span><span 
class="p">(</span><span class="n">args</span><span class="p">);</span>
+                <span class="n">transports</span><span class="p">[</span><span 
class="n">i</span><span class="p">]</span> <span class="o">=</span> <span 
class="n">t</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;Selected client transport: 
{transports[0]}&quot;</span><span class="p">);</span>
+
+            <span class="n">var</span> <span class="n">protocols</span> <span 
class="o">=</span> <span class="k">new</span> <span class="n">Tuple</span><span 
class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> 
<span class="n">TProtocol</span><span class="o">&gt;</span><span 
class="p">[</span><span class="n">numClients</span><span class="p">];</span>
+            <span class="k">for</span> <span class="p">(</span><span 
class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span 
class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span 
class="o">&lt;</span> <span class="n">numClients</span><span class="p">;</span> 
<span class="n">i</span><span class="o">++</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">var</span> <span class="n">p</span> <span 
class="o">=</span> <span class="n">GetProtocol</span><span 
class="p">(</span><span class="n">args</span><span class="p">,</span> <span 
class="n">transports</span><span class="p">[</span><span 
class="n">i</span><span class="p">]);</span>
+                <span class="n">protocols</span><span class="p">[</span><span 
class="n">i</span><span class="p">]</span> <span class="o">=</span> <span 
class="n">p</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;Selected client protocol: 
{protocols[0].Item1}&quot;</span><span class="p">);</span>
+
+            <span class="n">var</span> <span class="n">tasks</span> <span 
class="o">=</span> <span class="k">new</span> <span class="n">Task</span><span 
class="p">[</span><span class="n">numClients</span><span class="p">];</span>
+            <span class="k">for</span> <span class="p">(</span><span 
class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span 
class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span 
class="o">&lt;</span> <span class="n">numClients</span><span class="p">;</span> 
<span class="n">i</span><span class="o">++</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">var</span> <span class="n">task</span> <span 
class="o">=</span> <span class="n">RunClientAsync</span><span 
class="p">(</span><span class="n">protocols</span><span class="p">[</span><span 
class="n">i</span><span class="p">],</span> <span 
class="n">cancellationToken</span><span class="p">);</span>
+                <span class="n">tasks</span><span class="p">[</span><span 
class="n">i</span><span class="p">]</span> <span class="o">=</span> <span 
class="n">task</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="n">Task</span><span class="p">.</span><span 
class="n">WaitAll</span><span class="p">(</span><span 
class="n">tasks</span><span class="p">);</span>
+
+            <span class="n">await</span> <span class="n">Task</span><span 
class="p">.</span><span class="n">CompletedTask</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">TTransport</span> <span class="n">GetTransport</span><span 
class="p">(</span><span class="n">string</span><span class="p">[]</span> <span 
class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">transport</span> <span 
class="o">=</span> <span class="n">args</span><span class="p">.</span><span 
class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> 
<span class="o">=&gt;</span> <span class="n">x</span><span 
class="p">.</span><span class="n">StartsWith</span><span 
class="p">(</span><span class="s">&quot;-tr&quot;</span><span 
class="p">))</span><span class="o">?</span><span class="p">.</span><span 
class="n">Split</span><span class="p">(</span><span 
class="sc">&#39;:&#39;</span><span class="p">)</span><span 
class="o">?</span><span class="p">[</span><span class="mi">1</span><span 
class="p">];</span>
+
+            <span class="n">Transport</span> <span 
class="n">selectedTransport</span><span class="p">;</span>
+            <span class="k">if</span> <span class="p">(</span><span 
class="n">Enum</span><span class="p">.</span><span 
class="n">TryParse</span><span class="p">(</span><span 
class="n">transport</span><span class="p">,</span> <span 
class="kc">true</span><span class="p">,</span> <span class="n">out</span> <span 
class="n">selectedTransport</span><span class="p">))</span>
+            <span class="p">{</span>
+                <span class="k">switch</span> <span class="p">(</span><span 
class="n">selectedTransport</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span class="nl">Tcp:</span>
+                        <span class="k">return</span> <span 
class="k">new</span> <span class="n">TSocketTransport</span><span 
class="p">(</span><span class="n">IPAddress</span><span class="p">.</span><span 
class="n">Loopback</span><span class="p">,</span> <span 
class="mi">9090</span><span class="p">);</span>
+                    <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span 
class="nl">NamedPipe:</span>
+                        <span class="k">return</span> <span 
class="k">new</span> <span class="n">TNamedPipeTransport</span><span 
class="p">(</span><span class="s">&quot;.test&quot;</span><span 
class="p">);</span>
+                    <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span class="nl">Http:</span>
+                        <span class="k">return</span> <span 
class="k">new</span> <span class="n">THttpTransport</span><span 
class="p">(</span><span class="k">new</span> <span class="n">Uri</span><span 
class="p">(</span><span class="s">&quot;http://localhost:9090&quot;</span><span 
class="p">),</span> <span class="n">null</span><span class="p">);</span>
+                    <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span 
class="nl">TcpBuffered:</span>
+                        <span class="k">return</span> <span 
class="k">new</span> <span class="n">TBufferedTransport</span><span 
class="p">(</span><span class="k">new</span> <span 
class="n">TSocketTransport</span><span class="p">(</span><span 
class="n">IPAddress</span><span class="p">.</span><span 
class="n">Loopback</span><span class="p">,</span> <span 
class="mi">9090</span><span class="p">));</span>
+                    <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span 
class="nl">TcpTls:</span>
+                        <span class="k">return</span> <span 
class="k">new</span> <span class="n">TTlsSocketTransport</span><span 
class="p">(</span><span class="n">IPAddress</span><span class="p">.</span><span 
class="n">Loopback</span><span class="p">,</span> <span 
class="mi">9090</span><span class="p">,</span> <span 
class="n">GetCertificate</span><span class="p">(),</span> <span 
class="n">CertValidator</span><span class="p">,</span> <span 
class="n">LocalCertificateSelectionCallback</span><span class="p">);</span>
+                    <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span 
class="nl">Framed:</span>
+                        <span class="k">return</span> <span 
class="k">new</span> <span class="n">TFramedTransport</span><span 
class="p">(</span><span class="k">new</span> <span 
class="n">TSocketTransport</span><span class="p">(</span><span 
class="n">IPAddress</span><span class="p">.</span><span 
class="n">Loopback</span><span class="p">,</span> <span 
class="mi">9090</span><span class="p">));</span>
+                <span class="p">}</span>
+            <span class="p">}</span>
+
+            <span class="k">return</span> <span class="k">new</span> <span 
class="n">TSocketTransport</span><span class="p">(</span><span 
class="n">IPAddress</span><span class="p">.</span><span 
class="n">Loopback</span><span class="p">,</span> <span 
class="mi">9090</span><span class="p">);</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="kt">int</span> <span class="n">GetNumberOfClients</span><span 
class="p">(</span><span class="n">string</span><span class="p">[]</span> <span 
class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">numClients</span> <span 
class="o">=</span> <span class="n">args</span><span class="p">.</span><span 
class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> 
<span class="o">=&gt;</span> <span class="n">x</span><span 
class="p">.</span><span class="n">StartsWith</span><span 
class="p">(</span><span class="s">&quot;-mc&quot;</span><span 
class="p">))</span><span class="o">?</span><span class="p">.</span><span 
class="n">Split</span><span class="p">(</span><span 
class="sc">&#39;:&#39;</span><span class="p">)</span><span 
class="o">?</span><span class="p">[</span><span class="mi">1</span><span 
class="p">];</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;Selected # of clients: 
{numClients}&quot;</span><span class="p">);</span>
+
+            <span class="kt">int</span> <span class="n">c</span><span 
class="p">;</span>
+            <span class="k">if</span><span class="p">(</span> <span 
class="kt">int</span><span class="p">.</span><span 
class="n">TryParse</span><span class="p">(</span><span 
class="n">numClients</span><span class="p">,</span> <span class="n">out</span> 
<span class="n">c</span><span class="p">)</span> <span 
class="o">&amp;&amp;</span> <span class="p">(</span><span class="mi">0</span> 
<span class="o">&lt;</span> <span class="n">c</span><span class="p">)</span> 
<span class="o">&amp;&amp;</span> <span class="p">(</span><span 
class="n">c</span> <span class="o">&lt;=</span> <span 
class="mi">100</span><span class="p">))</span>
+                <span class="k">return</span> <span class="n">c</span><span 
class="p">;</span>
+            <span class="k">else</span>
+                <span class="k">return</span> <span class="mi">1</span><span 
class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">X509Certificate2</span> <span class="n">GetCertificate</span><span 
class="p">()</span>
+        <span class="p">{</span>
+            <span class="c1">// due to files location in net core better to 
take certs from top folder</span>
+            <span class="n">var</span> <span class="n">certFile</span> <span 
class="o">=</span> <span class="n">GetCertPath</span><span 
class="p">(</span><span class="n">Directory</span><span class="p">.</span><span 
class="n">GetParent</span><span class="p">(</span><span 
class="n">Directory</span><span class="p">.</span><span 
class="n">GetCurrentDirectory</span><span class="p">()));</span>
+            <span class="k">return</span> <span class="k">new</span> <span 
class="n">X509Certificate2</span><span class="p">(</span><span 
class="n">certFile</span><span class="p">,</span> <span 
class="s">&quot;ThriftTest&quot;</span><span class="p">);</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">string</span> <span class="n">GetCertPath</span><span 
class="p">(</span><span class="n">DirectoryInfo</span> <span 
class="n">di</span><span class="p">,</span> <span class="kt">int</span> <span 
class="n">maxCount</span> <span class="o">=</span> <span 
class="mi">6</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">topDir</span> <span 
class="o">=</span> <span class="n">di</span><span class="p">;</span>
+            <span class="n">var</span> <span class="n">certFile</span> <span 
class="o">=</span>
+                <span class="n">topDir</span><span class="p">.</span><span 
class="n">EnumerateFiles</span><span class="p">(</span><span 
class="s">&quot;ThriftTest.pfx&quot;</span><span class="p">,</span> <span 
class="n">SearchOption</span><span class="p">.</span><span 
class="n">AllDirectories</span><span class="p">)</span>
+                    <span class="p">.</span><span 
class="n">FirstOrDefault</span><span class="p">();</span>
+            <span class="k">if</span> <span class="p">(</span><span 
class="n">certFile</span> <span class="o">==</span> <span 
class="n">null</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="k">if</span> <span class="p">(</span><span 
class="n">maxCount</span> <span class="o">==</span> <span 
class="mi">0</span><span class="p">)</span>
+                    <span class="k">throw</span> <span class="k">new</span> 
<span class="n">FileNotFoundException</span><span class="p">(</span><span 
class="s">&quot;Cannot find file in directories&quot;</span><span 
class="p">);</span>
+                <span class="k">return</span> <span 
class="n">GetCertPath</span><span class="p">(</span><span 
class="n">di</span><span class="p">.</span><span class="n">Parent</span><span 
class="p">,</span> <span class="n">maxCount</span> <span class="o">-</span> 
<span class="mi">1</span><span class="p">);</span>
+            <span class="p">}</span>
+
+            <span class="k">return</span> <span class="n">certFile</span><span 
class="p">.</span><span class="n">FullName</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">X509Certificate</span> <span 
class="n">LocalCertificateSelectionCallback</span><span class="p">(</span><span 
class="n">object</span> <span class="n">sender</span><span class="p">,</span>
+            <span class="n">string</span> <span 
class="n">targetHost</span><span class="p">,</span> <span 
class="n">X509CertificateCollection</span> <span 
class="n">localCertificates</span><span class="p">,</span>
+            <span class="n">X509Certificate</span> <span 
class="n">remoteCertificate</span><span class="p">,</span> <span 
class="n">string</span><span class="p">[]</span> <span 
class="n">acceptableIssuers</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="k">return</span> <span 
class="n">GetCertificate</span><span class="p">();</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="kt">bool</span> <span class="n">CertValidator</span><span 
class="p">(</span><span class="n">object</span> <span 
class="n">sender</span><span class="p">,</span> <span 
class="n">X509Certificate</span> <span class="n">certificate</span><span 
class="p">,</span>
+            <span class="n">X509Chain</span> <span class="n">chain</span><span 
class="p">,</span> <span class="n">SslPolicyErrors</span> <span 
class="n">sslPolicyErrors</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="k">return</span> <span class="kc">true</span><span 
class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">Tuple</span><span class="o">&lt;</span><span 
class="n">Protocol</span><span class="p">,</span> <span 
class="n">TProtocol</span><span class="o">&gt;</span> <span 
class="n">GetProtocol</span><span class="p">(</span><span 
class="n">string</span><span class="p">[]</span> <span 
class="n">args</span><span class="p">,</span> <span class="n">TTransport</span> 
<span class="n">transport</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">protocol</span> <span 
class="o">=</span> <span class="n">args</span><span class="p">.</span><span 
class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> 
<span class="o">=&gt;</span> <span class="n">x</span><span 
class="p">.</span><span class="n">StartsWith</span><span 
class="p">(</span><span class="s">&quot;-pr&quot;</span><span 
class="p">))</span><span class="o">?</span><span class="p">.</span><span 
class="n">Split</span><span class="p">(</span><span 
class="sc">&#39;:&#39;</span><span class="p">)</span><span 
class="o">?</span><span class="p">[</span><span class="mi">1</span><span 
class="p">];</span>
+
+            <span class="n">Protocol</span> <span 
class="n">selectedProtocol</span><span class="p">;</span>
+            <span class="k">if</span> <span class="p">(</span><span 
class="n">Enum</span><span class="p">.</span><span 
class="n">TryParse</span><span class="p">(</span><span 
class="n">protocol</span><span class="p">,</span> <span 
class="kc">true</span><span class="p">,</span> <span class="n">out</span> <span 
class="n">selectedProtocol</span><span class="p">))</span>
+            <span class="p">{</span>
+                <span class="k">switch</span> <span class="p">(</span><span 
class="n">selectedProtocol</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="k">case</span> <span 
class="n">Protocol</span><span class="p">.</span><span class="nl">Binary:</span>
+                        <span class="k">return</span> <span 
class="k">new</span> <span class="n">Tuple</span><span 
class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> 
<span class="n">TProtocol</span><span class="o">&gt;</span><span 
class="p">(</span><span class="n">selectedProtocol</span><span 
class="p">,</span> <span class="k">new</span> <span 
class="n">TBinaryProtocol</span><span class="p">(</span><span 
class="n">transport</span><span class="p">));</span>
+                    <span class="k">case</span> <span 
class="n">Protocol</span><span class="p">.</span><span 
class="nl">Compact:</span>
+                        <span class="k">return</span> <span 
class="k">new</span> <span class="n">Tuple</span><span 
class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> 
<span class="n">TProtocol</span><span class="o">&gt;</span><span 
class="p">(</span><span class="n">selectedProtocol</span><span 
class="p">,</span> <span class="k">new</span> <span 
class="n">TCompactProtocol</span><span class="p">(</span><span 
class="n">transport</span><span class="p">));</span>
+                    <span class="k">case</span> <span 
class="n">Protocol</span><span class="p">.</span><span class="nl">Json:</span>
+                        <span class="k">return</span> <span 
class="k">new</span> <span class="n">Tuple</span><span 
class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> 
<span class="n">TProtocol</span><span class="o">&gt;</span><span 
class="p">(</span><span class="n">selectedProtocol</span><span 
class="p">,</span> <span class="k">new</span> <span 
class="n">TJsonProtocol</span><span class="p">(</span><span 
class="n">transport</span><span class="p">));</span>
+                    <span class="k">case</span> <span 
class="n">Protocol</span><span class="p">.</span><span 
class="nl">Multiplexed:</span>
+                        <span class="c1">// it returns BinaryProtocol to avoid 
making wrapped protocol as public in TProtocolDecorator (in RunClientAsync it 
will be wrapped into Multiplexed protocol)</span>
+                        <span class="k">return</span> <span 
class="k">new</span> <span class="n">Tuple</span><span 
class="o">&lt;</span><span class="n">Protocol</span><span class="p">,</span> 
<span class="n">TProtocol</span><span class="o">&gt;</span><span 
class="p">(</span><span class="n">selectedProtocol</span><span 
class="p">,</span> <span class="k">new</span> <span 
class="n">TBinaryProtocol</span><span class="p">(</span><span 
class="n">transport</span><span class="p">));</span>
+                <span class="p">}</span>
+            <span class="p">}</span>
+
+            <span class="k">return</span> <span class="k">new</span> <span 
class="n">Tuple</span><span class="o">&lt;</span><span 
class="n">Protocol</span><span class="p">,</span> <span 
class="n">TProtocol</span><span class="o">&gt;</span><span 
class="p">(</span><span class="n">selectedProtocol</span><span 
class="p">,</span> <span class="k">new</span> <span 
class="n">TBinaryProtocol</span><span class="p">(</span><span 
class="n">transport</span><span class="p">));</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">async</span> <span class="n">Task</span> <span 
class="n">RunClientAsync</span><span class="p">(</span><span 
class="n">Tuple</span><span class="o">&lt;</span><span 
class="n">Protocol</span><span class="p">,</span> <span 
class="n">TProtocol</span><span class="o">&gt;</span> <span 
class="n">protocolTuple</span><span class="p">,</span> <span 
class="n">CancellationToken</span> <span 
class="n">cancellationToken</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="k">try</span>
+            <span class="p">{</span>
+                <span class="n">var</span> <span class="n">protocol</span> 
<span class="o">=</span> <span class="n">protocolTuple</span><span 
class="p">.</span><span class="n">Item2</span><span class="p">;</span>
+                <span class="n">var</span> <span class="n">protocolType</span> 
<span class="o">=</span> <span class="n">protocolTuple</span><span 
class="p">.</span><span class="n">Item1</span><span class="p">;</span>
+
+                <span class="n">TBaseClient</span> <span 
class="n">client</span> <span class="o">=</span> <span 
class="n">null</span><span class="p">;</span>
+
+                <span class="k">try</span>
+                <span class="p">{</span>
+                    <span class="k">if</span> <span class="p">(</span><span 
class="n">protocolType</span> <span class="o">!=</span> <span 
class="n">Protocol</span><span class="p">.</span><span 
class="n">Multiplexed</span><span class="p">)</span>
+                    <span class="p">{</span>
+
+                        <span class="n">client</span> <span class="o">=</span> 
<span class="k">new</span> <span class="n">Calculator</span><span 
class="p">.</span><span class="n">Client</span><span class="p">(</span><span 
class="n">protocol</span><span class="p">);</span>
+                        <span class="n">await</span> <span 
class="n">ExecuteCalculatorClientOperations</span><span class="p">(</span><span 
class="n">cancellationToken</span><span class="p">,</span> <span 
class="p">(</span><span class="n">Calculator</span><span 
class="p">.</span><span class="n">Client</span><span class="p">)</span><span 
class="n">client</span><span class="p">);</span>
+                    <span class="p">}</span>
+                    <span class="k">else</span>
+                    <span class="p">{</span>
+                        <span class="c1">// it uses binary protocol there  to 
create Multiplexed protocols</span>
+                        <span class="n">var</span> <span 
class="n">multiplex</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">TMultiplexedProtocol</span><span class="p">(</span><span 
class="n">protocol</span><span class="p">,</span> <span 
class="n">nameof</span><span class="p">(</span><span 
class="n">Calculator</span><span class="p">));</span>
+                        <span class="n">client</span> <span class="o">=</span> 
<span class="k">new</span> <span class="n">Calculator</span><span 
class="p">.</span><span class="n">Client</span><span class="p">(</span><span 
class="n">multiplex</span><span class="p">);</span>
+                        <span class="n">await</span> <span 
class="n">ExecuteCalculatorClientOperations</span><span class="p">(</span><span 
class="n">cancellationToken</span><span class="p">,</span> <span 
class="p">(</span><span class="n">Calculator</span><span 
class="p">.</span><span class="n">Client</span><span class="p">)</span><span 
class="n">client</span><span class="p">);</span>
+
+                        <span class="n">multiplex</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TMultiplexedProtocol</span><span class="p">(</span><span 
class="n">protocol</span><span class="p">,</span> <span 
class="n">nameof</span><span class="p">(</span><span 
class="n">SharedService</span><span class="p">));</span>
+                        <span class="n">client</span> <span class="o">=</span> 
<span class="k">new</span> <span class="n">SharedService</span><span 
class="p">.</span><span class="n">Client</span><span class="p">(</span><span 
class="n">multiplex</span><span class="p">);</span>
+                        <span class="n">await</span> <span 
class="n">ExecuteSharedServiceClientOperations</span><span 
class="p">(</span><span class="n">cancellationToken</span><span 
class="p">,</span> <span class="p">(</span><span 
class="n">SharedService</span><span class="p">.</span><span 
class="n">Client</span><span class="p">)</span><span 
class="n">client</span><span class="p">);</span>
+                    <span class="p">}</span>
+                <span class="p">}</span>
+                <span class="k">catch</span> <span class="p">(</span><span 
class="n">Exception</span> <span class="n">ex</span><span class="p">)</span>
+                <span class="p">{</span>
+                    <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogError</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client?.ClientId} &quot;</span> 
<span class="o">+</span> <span class="n">ex</span><span class="p">);</span>
+                <span class="p">}</span>
+                <span class="n">finally</span>
+                <span class="p">{</span>
+                    <span class="n">protocol</span><span 
class="p">.</span><span class="n">Transport</span><span class="p">.</span><span 
class="n">Close</span><span class="p">();</span>
+                <span class="p">}</span>
+            <span class="p">}</span>
+            <span class="k">catch</span> <span class="p">(</span><span 
class="n">TApplicationException</span> <span class="n">x</span><span 
class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogError</span><span class="p">(</span><span class="n">x</span><span 
class="p">.</span><span class="n">ToString</span><span class="p">());</span>
+            <span class="p">}</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">async</span> <span class="n">Task</span> <span 
class="n">ExecuteCalculatorClientOperations</span><span class="p">(</span><span 
class="n">CancellationToken</span> <span 
class="n">cancellationToken</span><span class="p">,</span> <span 
class="n">Calculator</span><span class="p">.</span><span 
class="n">Client</span> <span class="n">client</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">await</span> <span class="n">client</span><span 
class="p">.</span><span class="n">OpenTransportAsync</span><span 
class="p">(</span><span class="n">cancellationToken</span><span 
class="p">);</span>
+
+            <span class="c1">// Async version</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} 
PingAsync()&quot;</span><span class="p">);</span>
+            <span class="n">await</span> <span class="n">client</span><span 
class="p">.</span><span class="n">pingAsync</span><span class="p">(</span><span 
class="n">cancellationToken</span><span class="p">);</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} 
AddAsync(1,1)&quot;</span><span class="p">);</span>
+            <span class="n">var</span> <span class="n">sum</span> <span 
class="o">=</span> <span class="n">await</span> <span 
class="n">client</span><span class="p">.</span><span 
class="n">addAsync</span><span class="p">(</span><span class="mi">1</span><span 
class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span 
class="n">cancellationToken</span><span class="p">);</span>
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} 
AddAsync(1,1)={sum}&quot;</span><span class="p">);</span>
+
+            <span class="n">var</span> <span class="n">work</span> <span 
class="o">=</span> <span class="k">new</span> <span class="n">Work</span>
+            <span class="p">{</span>
+                <span class="n">Op</span> <span class="o">=</span> <span 
class="n">Operation</span><span class="p">.</span><span 
class="n">DIVIDE</span><span class="p">,</span>
+                <span class="n">Num1</span> <span class="o">=</span> <span 
class="mi">1</span><span class="p">,</span>
+                <span class="n">Num2</span> <span class="o">=</span> <span 
class="mi">0</span>
+            <span class="p">};</span>
+
+            <span class="k">try</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} 
CalculateAsync(1)&quot;</span><span class="p">);</span>
+                <span class="n">await</span> <span 
class="n">client</span><span class="p">.</span><span 
class="n">calculateAsync</span><span class="p">(</span><span 
class="mi">1</span><span class="p">,</span> <span class="n">work</span><span 
class="p">,</span> <span class="n">cancellationToken</span><span 
class="p">);</span>
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} Whoa we can divide 
by 0&quot;</span><span class="p">);</span>
+            <span class="p">}</span>
+            <span class="k">catch</span> <span class="p">(</span><span 
class="n">InvalidOperation</span> <span class="n">io</span><span 
class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} Invalid operation: 
&quot;</span> <span class="o">+</span> <span class="n">io</span><span 
class="p">);</span>
+            <span class="p">}</span>
+
+            <span class="n">work</span><span class="p">.</span><span 
class="n">Op</span> <span class="o">=</span> <span 
class="n">Operation</span><span class="p">.</span><span 
class="n">SUBTRACT</span><span class="p">;</span>
+            <span class="n">work</span><span class="p">.</span><span 
class="n">Num1</span> <span class="o">=</span> <span class="mi">15</span><span 
class="p">;</span>
+            <span class="n">work</span><span class="p">.</span><span 
class="n">Num2</span> <span class="o">=</span> <span class="mi">10</span><span 
class="p">;</span>
+
+            <span class="k">try</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} 
CalculateAsync(1)&quot;</span><span class="p">);</span>
+                <span class="n">var</span> <span class="n">diff</span> <span 
class="o">=</span> <span class="n">await</span> <span 
class="n">client</span><span class="p">.</span><span 
class="n">calculateAsync</span><span class="p">(</span><span 
class="mi">1</span><span class="p">,</span> <span class="n">work</span><span 
class="p">,</span> <span class="n">cancellationToken</span><span 
class="p">);</span>
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} 
15-10={diff}&quot;</span><span class="p">);</span>
+            <span class="p">}</span>
+            <span class="k">catch</span> <span class="p">(</span><span 
class="n">InvalidOperation</span> <span class="n">io</span><span 
class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} Invalid operation: 
&quot;</span> <span class="o">+</span> <span class="n">io</span><span 
class="p">);</span>
+            <span class="p">}</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} 
GetStructAsync(1)&quot;</span><span class="p">);</span>
+            <span class="n">var</span> <span class="n">log</span> <span 
class="o">=</span> <span class="n">await</span> <span 
class="n">client</span><span class="p">.</span><span 
class="n">getStructAsync</span><span class="p">(</span><span 
class="mi">1</span><span class="p">,</span> <span 
class="n">cancellationToken</span><span class="p">);</span>
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} Check log: 
{log.Value}&quot;</span><span class="p">);</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} ZipAsync() with 
delay 100mc on server side&quot;</span><span class="p">);</span>
+            <span class="n">await</span> <span class="n">client</span><span 
class="p">.</span><span class="n">zipAsync</span><span class="p">(</span><span 
class="n">cancellationToken</span><span class="p">);</span>
+        <span class="p">}</span>
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">async</span> <span class="n">Task</span> <span 
class="n">ExecuteSharedServiceClientOperations</span><span 
class="p">(</span><span class="n">CancellationToken</span> <span 
class="n">cancellationToken</span><span class="p">,</span> <span 
class="n">SharedService</span><span class="p">.</span><span 
class="n">Client</span> <span class="n">client</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">await</span> <span class="n">client</span><span 
class="p">.</span><span class="n">OpenTransportAsync</span><span 
class="p">(</span><span class="n">cancellationToken</span><span 
class="p">);</span>
+
+            <span class="c1">// Async version</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} SharedService 
GetStructAsync(1)&quot;</span><span class="p">);</span>
+            <span class="n">var</span> <span class="n">log</span> <span 
class="o">=</span> <span class="n">await</span> <span 
class="n">client</span><span class="p">.</span><span 
class="n">getStructAsync</span><span class="p">(</span><span 
class="mi">1</span><span class="p">,</span> <span 
class="n">cancellationToken</span><span class="p">);</span>
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">$</span><span class="s">&quot;{client.ClientId} SharedService 
Value: {log.Value}&quot;</span><span class="p">);</span>
+        <span class="p">}</span>
+
+
+        <span class="k">private</span> <span class="k">enum</span> <span 
class="n">Transport</span>
+        <span class="p">{</span>
+            <span class="n">Tcp</span><span class="p">,</span>
+            <span class="n">NamedPipe</span><span class="p">,</span>
+            <span class="n">Http</span><span class="p">,</span>
+            <span class="n">TcpBuffered</span><span class="p">,</span>
+            <span class="n">Framed</span><span class="p">,</span>
+            <span class="n">TcpTls</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">enum</span> <span 
class="n">Protocol</span>
+        <span class="p">{</span>
+            <span class="n">Binary</span><span class="p">,</span>
+            <span class="n">Compact</span><span class="p">,</span>
+            <span class="n">Json</span><span class="p">,</span>
+            <span class="n">Multiplexed</span>
+        <span class="p">}</span>
+    <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+<p class='snippet_footer'>
+  This snippet was generated by Apache Thrift's <strong>source tree 
docs</strong>:
+  <a 
href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;f=tutorial/netstd/Client/Program.cs;hb=HEAD";</a>tutorial/netstd/Client/Program.cs</a>
+</p>
+
+<h3 id="server">Server<a class="headerlink" href="#server" title="Permanent 
link">&para;</a></h3>
+<style type="text/css">
+/* The following code is added by mdx_elementid.py
+   It was originally lifted from http://subversion.apache.org/style/site.css */
+/*
+ * Hide class="elementid-permalink", except when an enclosing heading
+ * has the :hover property.
+ */
+.headerlink, .elementid-permalink {
+  visibility: hidden;
+}
+h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, 
h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, 
dt:hover > .elementid-permalink { visibility: visible }</style>
+
+<div class="codehilite"><pre><span class="k">using</span> <span 
class="n">System</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Collections</span><span 
class="p">.</span><span class="n">Generic</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">IO</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Linq</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Net</span><span class="p">.</span><span 
class="n">Security</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Security</span><span class="p">.</span><span 
class="n">Cryptography</span><span class="p">.</span><span 
class="n">X509Certificates</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Threading</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">System</span><span 
class="p">.</span><span class="n">Threading</span><span class="p">.</span><span 
class="n">Tasks</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span 
class="p">.</span><span class="n">AspNetCore</span><span 
class="p">.</span><span class="n">Builder</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span 
class="p">.</span><span class="n">AspNetCore</span><span 
class="p">.</span><span class="n">Hosting</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span 
class="p">.</span><span class="n">Extensions</span><span 
class="p">.</span><span class="n">Configuration</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span 
class="p">.</span><span class="n">Extensions</span><span 
class="p">.</span><span class="n">DependencyInjection</span><span 
class="p">;</span>
+<span class="k">using</span> <span class="n">Microsoft</span><span 
class="p">.</span><span class="n">Extensions</span><span 
class="p">.</span><span class="n">Logging</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span 
class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span 
class="p">.</span><span class="n">Protocol</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span 
class="p">.</span><span class="n">Server</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span 
class="p">.</span><span class="n">Transport</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span 
class="p">.</span><span class="n">Transport</span><span class="p">.</span><span 
class="n">Server</span><span class="p">;</span>
+<span class="k">using</span> <span class="n">tutorial</span><span 
class="p">;</span>
+<span class="k">using</span> <span class="n">shared</span><span 
class="p">;</span>
+<span class="k">using</span> <span class="n">Thrift</span><span 
class="p">.</span><span class="n">Processor</span><span class="p">;</span>
+
+<span class="k">namespace</span> <span class="n">Server</span>
+<span class="p">{</span>
+    <span class="k">public</span> <span class="k">class</span> <span 
class="nc">Program</span>
+    <span class="p">{</span>
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">readonly</span> <span class="n">ILogger</span> <span 
class="n">Logger</span> <span class="o">=</span> <span class="k">new</span> 
<span class="n">LoggerFactory</span><span class="p">().</span><span 
class="n">AddConsole</span><span class="p">(</span><span 
class="n">LogLevel</span><span class="p">.</span><span 
class="n">Trace</span><span class="p">).</span><span 
class="n">AddDebug</span><span class="p">(</span><span 
class="n">LogLevel</span><span class="p">.</span><span 
class="n">Trace</span><span class="p">).</span><span 
class="n">CreateLogger</span><span class="p">(</span><span 
class="n">nameof</span><span class="p">(</span><span 
class="n">Server</span><span class="p">));</span>
+
+        <span class="k">public</span> <span class="k">static</span> <span 
class="kt">void</span> <span class="n">Main</span><span class="p">(</span><span 
class="n">string</span><span class="p">[]</span> <span 
class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">args</span> <span class="o">=</span> <span 
class="n">args</span> <span class="o">??</span> <span class="k">new</span> 
<span class="n">string</span><span class="p">[</span><span 
class="mi">0</span><span class="p">];</span>
+
+            <span class="k">if</span> <span class="p">(</span><span 
class="n">args</span><span class="p">.</span><span class="n">Any</span><span 
class="p">(</span><span class="n">x</span> <span class="o">=&gt;</span> <span 
class="n">x</span><span class="p">.</span><span 
class="n">StartsWith</span><span class="p">(</span><span 
class="s">&quot;-help&quot;</span><span class="p">,</span> <span 
class="n">StringComparison</span><span class="p">.</span><span 
class="n">OrdinalIgnoreCase</span><span class="p">)))</span>
+            <span class="p">{</span>
+                <span class="n">DisplayHelp</span><span class="p">();</span>
+                <span class="k">return</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="k">using</span> <span class="p">(</span><span 
class="n">var</span> <span class="n">source</span> <span class="o">=</span> 
<span class="k">new</span> <span class="n">CancellationTokenSource</span><span 
class="p">())</span>
+            <span class="p">{</span>
+                <span class="n">RunAsync</span><span class="p">(</span><span 
class="n">args</span><span class="p">,</span> <span 
class="n">source</span><span class="p">.</span><span 
class="n">Token</span><span class="p">).</span><span 
class="n">GetAwaiter</span><span class="p">().</span><span 
class="n">GetResult</span><span class="p">();</span>
+
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="s">&quot;Press any key to stop...&quot;</span><span class="p">);</span>
+
+                <span class="n">Console</span><span class="p">.</span><span 
class="n">ReadLine</span><span class="p">();</span>
+                <span class="n">source</span><span class="p">.</span><span 
class="n">Cancel</span><span class="p">();</span>
+            <span class="p">}</span>
+
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="s">&quot;Server stopped&quot;</span><span class="p">);</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="kt">void</span> <span class="n">DisplayHelp</span><span 
class="p">()</span>
+        <span class="p">{</span>
+            <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="err">@</span><span class="s">&quot;</span>
+<span class="nl">Usage:</span> 
+    <span class="n">Server</span><span class="p">.</span><span 
class="n">exe</span> <span class="o">-</span><span class="n">help</span>
+        <span class="n">will</span> <span class="n">diplay</span> <span 
class="n">help</span> <span class="n">information</span>
+
+    <span class="n">Server</span><span class="p">.</span><span 
class="n">exe</span> <span class="o">-</span><span class="nl">tr:</span><span 
class="o">&lt;</span><span class="n">transport</span><span 
class="o">&gt;</span> <span class="o">-</span><span class="nl">pr:</span><span 
class="o">&lt;</span><span class="n">protocol</span><span class="o">&gt;</span>
+        <span class="n">will</span> <span class="n">run</span> <span 
class="n">server</span> <span class="n">with</span> <span 
class="n">specified</span> <span class="n">arguments</span> <span 
class="p">(</span><span class="n">tcp</span> <span class="n">transport</span> 
<span class="n">and</span> <span class="n">binary</span> <span 
class="n">protocol</span> <span class="n">by</span> <span 
class="k">default</span><span class="p">)</span>
+
+<span class="nl">Options:</span>
+    <span class="o">-</span><span class="n">tr</span> <span 
class="p">(</span><span class="n">transport</span><span class="p">)</span><span 
class="o">:</span> 
+        <span class="n">tcp</span> <span class="o">-</span> <span 
class="p">(</span><span class="k">default</span><span class="p">)</span> <span 
class="n">tcp</span> <span class="n">transport</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span> 
<span class="p">(</span><span class="n">host</span> <span class="o">-</span> 
<span class="s">&quot;&quot;</span><span class="n">localhost</span><span 
class="s">&quot;&quot;</span><span class="p">,</span> <span 
class="n">port</span> <span class="o">-</span> <span 
class="mi">9090</span><span class="p">)</span>
+        <span class="n">tcpbuffered</span> <span class="o">-</span> <span 
class="n">tcp</span> <span class="n">buffered</span> <span 
class="n">transport</span> <span class="n">will</span> <span 
class="n">be</span> <span class="n">used</span> <span class="p">(</span><span 
class="n">host</span> <span class="o">-</span> <span 
class="s">&quot;&quot;</span><span class="n">localhost</span><span 
class="s">&quot;&quot;</span><span class="p">,</span> <span 
class="n">port</span> <span class="o">-</span> <span 
class="mi">9090</span><span class="p">)</span>
+        <span class="n">namedpipe</span> <span class="o">-</span> <span 
class="n">namedpipe</span> <span class="n">transport</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span> 
<span class="p">(</span><span class="n">pipe</span> <span 
class="n">address</span> <span class="o">-</span> <span 
class="s">&quot;&quot;</span><span class="p">.</span><span 
class="n">test</span><span class="s">&quot;&quot;</span><span class="p">)</span>
+        <span class="n">http</span> <span class="o">-</span> <span 
class="n">http</span> <span class="n">transport</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span> 
<span class="p">(</span><span class="n">http</span> <span 
class="n">address</span> <span class="o">-</span> <span 
class="s">&quot;&quot;</span><span class="nl">localhost:</span><span 
class="mi">9090</span><span class="s">&quot;&quot;</span><span 
class="p">)</span>
+        <span class="n">tcptls</span> <span class="o">-</span> <span 
class="n">tcp</span> <span class="n">transport</span> <span 
class="n">with</span> <span class="n">tls</span> <span class="n">will</span> 
<span class="n">be</span> <span class="n">used</span> <span 
class="p">(</span><span class="n">host</span> <span class="o">-</span> <span 
class="s">&quot;&quot;</span><span class="n">localhost</span><span 
class="s">&quot;&quot;</span><span class="p">,</span> <span 
class="n">port</span> <span class="o">-</span> <span 
class="mi">9090</span><span class="p">)</span>
+        <span class="n">framed</span> <span class="o">-</span> <span 
class="n">tcp</span> <span class="n">framed</span> <span 
class="n">transport</span> <span class="n">will</span> <span 
class="n">be</span> <span class="n">used</span> <span class="p">(</span><span 
class="n">host</span> <span class="o">-</span> <span 
class="s">&quot;&quot;</span><span class="n">localhost</span><span 
class="s">&quot;&quot;</span><span class="p">,</span> <span 
class="n">port</span> <span class="o">-</span> <span 
class="mi">9090</span><span class="p">)</span>
+
+    <span class="o">-</span><span class="n">pr</span> <span 
class="p">(</span><span class="n">protocol</span><span class="p">)</span><span 
class="o">:</span> 
+        <span class="n">binary</span> <span class="o">-</span> <span 
class="p">(</span><span class="k">default</span><span class="p">)</span> <span 
class="n">binary</span> <span class="n">protocol</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span>
+        <span class="n">compact</span> <span class="o">-</span> <span 
class="n">compact</span> <span class="n">protocol</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span>
+        <span class="n">json</span> <span class="o">-</span> <span 
class="n">json</span> <span class="n">protocol</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span>
+        <span class="n">multiplexed</span> <span class="o">-</span> <span 
class="n">multiplexed</span> <span class="n">protocol</span> <span 
class="n">will</span> <span class="n">be</span> <span class="n">used</span>
+
+<span class="nl">Sample:</span>
+    <span class="n">Server</span><span class="p">.</span><span 
class="n">exe</span> <span class="o">-</span><span class="nl">tr:</span><span 
class="n">tcp</span> 
+<span class="s">&quot;);</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">async</span> <span class="n">Task</span> <span 
class="n">RunAsync</span><span class="p">(</span><span 
class="n">string</span><span class="p">[]</span> <span 
class="n">args</span><span class="p">,</span> <span 
class="n">CancellationToken</span> <span 
class="n">cancellationToken</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span 
class="n">selectedTransport</span> <span class="o">=</span> <span 
class="n">GetTransport</span><span class="p">(</span><span 
class="n">args</span><span class="p">);</span>
+            <span class="n">var</span> <span class="n">selectedProtocol</span> 
<span class="o">=</span> <span class="n">GetProtocol</span><span 
class="p">(</span><span class="n">args</span><span class="p">);</span>
+
+            <span class="k">if</span> <span class="p">(</span><span 
class="n">selectedTransport</span> <span class="o">==</span> <span 
class="n">Transport</span><span class="p">.</span><span 
class="n">Http</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="k">new</span> <span 
class="n">HttpServerSample</span><span class="p">().</span><span 
class="n">Run</span><span class="p">(</span><span 
class="n">cancellationToken</span><span class="p">);</span>
+            <span class="p">}</span>
+            <span class="k">else</span>
+            <span class="p">{</span>
+                <span class="n">await</span> <span 
class="n">RunSelectedConfigurationAsync</span><span class="p">(</span><span 
class="n">selectedTransport</span><span class="p">,</span> <span 
class="n">selectedProtocol</span><span class="p">,</span> <span 
class="n">cancellationToken</span><span class="p">);</span>
+            <span class="p">}</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">Protocol</span> <span class="n">GetProtocol</span><span 
class="p">(</span><span class="n">string</span><span class="p">[]</span> <span 
class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">transport</span> <span 
class="o">=</span> <span class="n">args</span><span class="p">.</span><span 
class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> 
<span class="o">=&gt;</span> <span class="n">x</span><span 
class="p">.</span><span class="n">StartsWith</span><span 
class="p">(</span><span class="s">&quot;-pr&quot;</span><span 
class="p">))</span><span class="o">?</span><span class="p">.</span><span 
class="n">Split</span><span class="p">(</span><span 
class="sc">&#39;:&#39;</span><span class="p">)</span><span 
class="o">?</span><span class="p">[</span><span class="mi">1</span><span 
class="p">];</span>
+
+            <span class="n">Enum</span><span class="p">.</span><span 
class="n">TryParse</span><span class="p">(</span><span 
class="n">transport</span><span class="p">,</span> <span 
class="kc">true</span><span class="p">,</span> <span class="n">out</span> <span 
class="n">Protocol</span> <span class="n">selectedProtocol</span><span 
class="p">);</span>
+
+            <span class="k">return</span> <span 
class="n">selectedProtocol</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">Transport</span> <span class="n">GetTransport</span><span 
class="p">(</span><span class="n">string</span><span class="p">[]</span> <span 
class="n">args</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">transport</span> <span 
class="o">=</span> <span class="n">args</span><span class="p">.</span><span 
class="n">FirstOrDefault</span><span class="p">(</span><span class="n">x</span> 
<span class="o">=&gt;</span> <span class="n">x</span><span 
class="p">.</span><span class="n">StartsWith</span><span 
class="p">(</span><span class="s">&quot;-tr&quot;</span><span 
class="p">))</span><span class="o">?</span><span class="p">.</span><span 
class="n">Split</span><span class="p">(</span><span 
class="sc">&#39;:&#39;</span><span class="p">)</span><span 
class="o">?</span><span class="p">[</span><span class="mi">1</span><span 
class="p">];</span>
+
+            <span class="n">Enum</span><span class="p">.</span><span 
class="n">TryParse</span><span class="p">(</span><span 
class="n">transport</span><span class="p">,</span> <span 
class="kc">true</span><span class="p">,</span> <span class="n">out</span> <span 
class="n">Transport</span> <span class="n">selectedTransport</span><span 
class="p">);</span>
+
+            <span class="k">return</span> <span 
class="n">selectedTransport</span><span class="p">;</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">async</span> <span class="n">Task</span> <span 
class="n">RunSelectedConfigurationAsync</span><span class="p">(</span><span 
class="n">Transport</span> <span class="n">transport</span><span 
class="p">,</span> <span class="n">Protocol</span> <span 
class="n">protocol</span><span class="p">,</span> <span 
class="n">CancellationToken</span> <span 
class="n">cancellationToken</span><span class="p">)</span>
+        <span class="p">{</span>
+            <span class="n">var</span> <span class="n">fabric</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">LoggerFactory</span><span class="p">().</span><span 
class="n">AddConsole</span><span class="p">(</span><span 
class="n">LogLevel</span><span class="p">.</span><span 
class="n">Trace</span><span class="p">).</span><span 
class="n">AddDebug</span><span class="p">(</span><span 
class="n">LogLevel</span><span class="p">.</span><span 
class="n">Trace</span><span class="p">);</span>
+            <span class="n">var</span> <span class="n">handler</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">CalculatorAsyncHandler</span><span class="p">();</span>
+            <span class="n">ITAsyncProcessor</span> <span 
class="n">processor</span> <span class="o">=</span> <span 
class="n">null</span><span class="p">;</span>
+
+            <span class="n">TServerTransport</span> <span 
class="n">serverTransport</span> <span class="o">=</span> <span 
class="n">null</span><span class="p">;</span>
+
+            <span class="k">switch</span> <span class="p">(</span><span 
class="n">transport</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span class="nl">Tcp:</span>
+                    <span class="n">serverTransport</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TServerSocketTransport</span><span class="p">(</span><span 
class="mi">9090</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+                <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span 
class="nl">TcpBuffered:</span>
+                    <span class="n">serverTransport</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TServerSocketTransport</span><span class="p">(</span><span 
class="nl">port:</span> <span class="mi">9090</span><span class="p">,</span> 
<span class="nl">clientTimeout:</span> <span class="mi">10000</span><span 
class="p">,</span> <span class="nl">useBufferedSockets:</span> <span 
class="kc">true</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+                <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span 
class="nl">NamedPipe:</span>
+                    <span class="n">serverTransport</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TNamedPipeServerTransport</span><span class="p">(</span><span 
class="s">&quot;.test&quot;</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+                <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span 
class="nl">TcpTls:</span>
+                    <span class="n">serverTransport</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TTlsServerSocketTransport</span><span class="p">(</span><span 
class="mi">9090</span><span class="p">,</span> <span 
class="kc">false</span><span class="p">,</span> <span 
class="n">GetCertificate</span><span class="p">(),</span> <span 
class="n">ClientCertValidator</span><span class="p">,</span> <span 
class="n">LocalCertificateSelectionCallback</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+                <span class="k">case</span> <span 
class="n">Transport</span><span class="p">.</span><span 
class="nl">Framed:</span>
+                    <span class="n">serverTransport</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TServerFramedTransport</span><span class="p">(</span><span 
class="mi">9090</span><span class="p">);</span>
+                    <span class="k">break</span><span class="p">;</span>
+            <span class="p">}</span>
+
+            <span class="n">ITProtocolFactory</span> <span 
class="n">inputProtocolFactory</span><span class="p">;</span>
+            <span class="n">ITProtocolFactory</span> <span 
class="n">outputProtocolFactory</span><span class="p">;</span>
+
+            <span class="k">switch</span> <span class="p">(</span><span 
class="n">protocol</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="k">case</span> <span 
class="n">Protocol</span><span class="p">.</span><span class="nl">Binary:</span>
+                <span class="p">{</span>
+                    <span class="n">inputProtocolFactory</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TBinaryProtocol</span><span class="p">.</span><span 
class="n">Factory</span><span class="p">();</span>
+                    <span class="n">outputProtocolFactory</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TBinaryProtocol</span><span class="p">.</span><span 
class="n">Factory</span><span class="p">();</span>
+                    <span class="n">processor</span> <span class="o">=</span> 
<span class="k">new</span> <span class="n">Calculator</span><span 
class="p">.</span><span class="n">AsyncProcessor</span><span 
class="p">(</span><span class="n">handler</span><span class="p">);</span>
+                <span class="p">}</span>
+                    <span class="k">break</span><span class="p">;</span>
+                <span class="k">case</span> <span 
class="n">Protocol</span><span class="p">.</span><span 
class="nl">Compact:</span>
+                <span class="p">{</span>
+                    <span class="n">inputProtocolFactory</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TCompactProtocol</span><span class="p">.</span><span 
class="n">Factory</span><span class="p">();</span>
+                    <span class="n">outputProtocolFactory</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TCompactProtocol</span><span class="p">.</span><span 
class="n">Factory</span><span class="p">();</span>
+                    <span class="n">processor</span> <span class="o">=</span> 
<span class="k">new</span> <span class="n">Calculator</span><span 
class="p">.</span><span class="n">AsyncProcessor</span><span 
class="p">(</span><span class="n">handler</span><span class="p">);</span>
+                <span class="p">}</span>
+                    <span class="k">break</span><span class="p">;</span>
+                <span class="k">case</span> <span 
class="n">Protocol</span><span class="p">.</span><span class="nl">Json:</span>
+                <span class="p">{</span>
+                    <span class="n">inputProtocolFactory</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TJsonProtocol</span><span class="p">.</span><span 
class="n">Factory</span><span class="p">();</span>
+                    <span class="n">outputProtocolFactory</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TJsonProtocol</span><span class="p">.</span><span 
class="n">Factory</span><span class="p">();</span>
+                    <span class="n">processor</span> <span class="o">=</span> 
<span class="k">new</span> <span class="n">Calculator</span><span 
class="p">.</span><span class="n">AsyncProcessor</span><span 
class="p">(</span><span class="n">handler</span><span class="p">);</span>
+                <span class="p">}</span>
+                    <span class="k">break</span><span class="p">;</span>
+                <span class="k">case</span> <span 
class="n">Protocol</span><span class="p">.</span><span 
class="nl">Multiplexed:</span>
+                <span class="p">{</span>
+                    <span class="n">inputProtocolFactory</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TBinaryProtocol</span><span class="p">.</span><span 
class="n">Factory</span><span class="p">();</span>
+                    <span class="n">outputProtocolFactory</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TBinaryProtocol</span><span class="p">.</span><span 
class="n">Factory</span><span class="p">();</span>
+
+                    <span class="n">var</span> <span 
class="n">calcHandler</span> <span class="o">=</span> <span 
class="k">new</span> <span class="n">CalculatorAsyncHandler</span><span 
class="p">();</span>
+                    <span class="n">var</span> <span 
class="n">calcProcessor</span> <span class="o">=</span> <span 
class="k">new</span> <span class="n">Calculator</span><span 
class="p">.</span><span class="n">AsyncProcessor</span><span 
class="p">(</span><span class="n">calcHandler</span><span class="p">);</span>
+
+                    <span class="n">var</span> <span 
class="n">sharedServiceHandler</span> <span class="o">=</span> <span 
class="k">new</span> <span class="n">SharedServiceAsyncHandler</span><span 
class="p">();</span>
+                    <span class="n">var</span> <span 
class="n">sharedServiceProcessor</span> <span class="o">=</span> <span 
class="k">new</span> <span class="n">SharedService</span><span 
class="p">.</span><span class="n">AsyncProcessor</span><span 
class="p">(</span><span class="n">sharedServiceHandler</span><span 
class="p">);</span>
+
+                    <span class="n">var</span> <span 
class="n">multiplexedProcessor</span> <span class="o">=</span> <span 
class="k">new</span> <span class="n">TMultiplexedProcessor</span><span 
class="p">();</span>
+                    <span class="n">multiplexedProcessor</span><span 
class="p">.</span><span class="n">RegisterProcessor</span><span 
class="p">(</span><span class="n">nameof</span><span class="p">(</span><span 
class="n">Calculator</span><span class="p">),</span> <span 
class="n">calcProcessor</span><span class="p">);</span>
+                    <span class="n">multiplexedProcessor</span><span 
class="p">.</span><span class="n">RegisterProcessor</span><span 
class="p">(</span><span class="n">nameof</span><span class="p">(</span><span 
class="n">SharedService</span><span class="p">),</span> <span 
class="n">sharedServiceProcessor</span><span class="p">);</span>
+
+                    <span class="n">processor</span> <span class="o">=</span> 
<span class="n">multiplexedProcessor</span><span class="p">;</span>
+                <span class="p">}</span>
+                    <span class="k">break</span><span class="p">;</span>
+                <span class="k">default</span><span class="o">:</span>
+                    <span class="k">throw</span> <span class="k">new</span> 
<span class="n">ArgumentOutOfRangeException</span><span class="p">(</span><span 
class="n">nameof</span><span class="p">(</span><span 
class="n">protocol</span><span class="p">),</span> <span 
class="n">protocol</span><span class="p">,</span> <span 
class="n">null</span><span class="p">);</span>
+            <span class="p">}</span>
+
+            <span class="k">try</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span>
+                    <span class="err">$</span><span class="s">&quot;Selected 
TAsyncServer with {serverTransport} transport, {processor} processor and 
{inputProtocolFactory} protocol factories&quot;</span><span class="p">);</span>
+
+                <span class="n">var</span> <span class="n">server</span> <span 
class="o">=</span> <span class="k">new</span> <span 
class="n">TSimpleAsyncServer</span><span class="p">(</span><span 
class="n">processor</span><span class="p">,</span> <span 
class="n">serverTransport</span><span class="p">,</span> <span 
class="n">inputProtocolFactory</span><span class="p">,</span> <span 
class="n">outputProtocolFactory</span><span class="p">,</span> <span 
class="n">fabric</span><span class="p">);</span>
+
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="s">&quot;Starting the server...&quot;</span><span class="p">);</span>
+                <span class="n">await</span> <span 
class="n">server</span><span class="p">.</span><span 
class="n">ServeAsync</span><span class="p">(</span><span 
class="n">cancellationToken</span><span class="p">);</span>
+            <span class="p">}</span>
+            <span class="k">catch</span> <span class="p">(</span><span 
class="n">Exception</span> <span class="n">x</span><span class="p">)</span>
+            <span class="p">{</span>
+                <span class="n">Logger</span><span class="p">.</span><span 
class="n">LogInformation</span><span class="p">(</span><span 
class="n">x</span><span class="p">.</span><span class="n">ToString</span><span 
class="p">());</span>
+            <span class="p">}</span>
+        <span class="p">}</span>
+
+        <span class="k">private</span> <span class="k">static</span> <span 
class="n">X509Certificate2</span> <span class="n">GetCertificate</span><span 
class="p">()</span>
+        <span class="p">{</span>
+            <span class="c1">// due to files location in net core better to 
take certs from top folder</span>

[... 250 lines stripped ...]

Reply via email to