Modified: websites/staging/thrift/trunk/content/tutorial/netstd.html ============================================================================== --- websites/staging/thrift/trunk/content/tutorial/netstd.html (original) +++ websites/staging/thrift/trunk/content/tutorial/netstd.html Wed Oct 16 21:27:43 2019 @@ -131,12 +131,15 @@ h2:hover > .headerlink, h3:hover > .head <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">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">System</span><span class="p">.</span><span class="n">Diagnostics</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="n">ServiceCollection</span> <span class="n">ServiceCollection</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ServiceCollection</span><span class="p">();</span> + <span class="k">private</span> <span class="k">static</span> <span class="n">ILogger</span> <span class="n">Logger</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> @@ -145,17 +148,20 @@ h2:hover > .headerlink, h3:hover > .head <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"><</span><span class="n">transport</span><span class="o">></span> <span class="o">-</span><span class="nl">pr:</span><span class="o"><</span><span class="n">protocol</span><span class="o">></span> <span class="o">-</span><span class="nl">mc:</span><span class="o"><</span><span class="n">numClients</span><span class="o">></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"><</span><span class="n">transport</span><span class="o">></span> <span class="o">-</span><span class="nl">bf:</span><span class="o"><</span><span class="n">buffering</span><span class="o">></span> <span class="o">-</span><span class="nl">pr:</span><span class="o"><</span><span class="n">protocol</span><span class="o">></span> <span class="o">-</span><span class="nl">mc:</span><span class="o"><</span><span class="n">numClients</span><span class="o">></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">""</span><span class="n">localhost</span><span class="s">""</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">""</span><span class="n">localhost</span><span class="s">""</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">""</span><span class="p">.</span><span class="n">test</span><span class="s">""</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">""</span><span class="nl">http:</span><span class="c1">//localhost:9090"") </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">""</span><span class="n">localhost</span><span class="s">""</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">""</span><span class="n">localhost</span><span class="s">""</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">bf</span> <span class="p">(</span><span class="n">buffering</span><span class="p">)</span><span class="o">:</span> + <span class="n">none</span> <span class="o">-</span> <span class="p">(</span><span class="k">default</span><span class="p">)</span> <span class="n">no</span> <span class="n">buffering</span> <span class="n">will</span> <span class="n">be</span> <span class="n">used</span> + <span class="n">buffered</span> <span class="o">-</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="n">framed</span> <span class="o">-</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="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> @@ -175,6 +181,9 @@ h2:hover > .headerlink, h3:hover > .head <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="n">ServiceCollection</span><span class="p">.</span><span class="n">AddLogging</span><span class="p">(</span><span class="n">logging</span> <span class="o">=></span> <span class="n">ConfigureLogging</span><span class="p">(</span><span class="n">logging</span><span class="p">));</span> + <span class="n">Logger</span> <span class="o">=</span> <span class="n">ServiceCollection</span><span class="p">.</span><span class="n">BuildServiceProvider</span><span class="p">().</span><span class="n">GetService</span><span class="o"><</span><span class="n">ILoggerFactory</span><span class="o">></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">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">=></span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-help"</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> @@ -189,6 +198,13 @@ h2:hover > .headerlink, h3:hover > .head <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">ConfigureLogging</span><span class="p">(</span><span class="n">ILoggingBuilder</span> <span class="n">logging</span><span class="p">)</span> + <span class="p">{</span> + <span class="n">logging</span><span class="p">.</span><span class="n">SetMinimumLevel</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">logging</span><span class="p">.</span><span class="n">AddConsole</span><span class="p">();</span> + <span class="n">logging</span><span class="p">.</span><span class="n">AddDebug</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> @@ -227,29 +243,57 @@ h2:hover > .headerlink, h3:hover > .head <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">=></span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-tr"</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">':'</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">TTransport</span> <span class="n">transport</span> <span class="o">=</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="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="c1">// construct endpoint transport</span> + <span class="n">var</span> <span class="n">transportArg</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">=></span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-tr"</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">':'</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</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">transportArg</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="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="n">transport</span> <span class="o">=</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">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="k">return</span> <span class="k">new</span> <span class="n">TNamedPipeTransport</span><span class="p">(</span><span class="s">".test"</span><span class="p">);</span> + <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TNamedPipeTransport</span><span class="p">(</span><span class="s">".test"</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">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">"http://localhost:9090"</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="n">transport</span> <span class="o">=</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">"http://localhost:9090"</span><span class="p">),</span> <span class="n">null</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="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="n">transport</span> <span class="o">=</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">break</span><span class="p">;</span> + + <span class="k">default</span><span class="o">:</span> + <span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="kc">false</span><span class="p">,</span> <span class="s">"unhandled case"</span><span class="p">);</span> + <span class="k">break</span><span class="p">;</span> + <span class="p">}</span> + <span class="p">}</span> + + <span class="c1">// optionally add layered transport(s)</span> + <span class="n">var</span> <span class="n">bufferingArg</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">=></span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-bf"</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">':'</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</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="o"><</span><span class="n">Buffering</span><span class="o">></span><span class="p">(</span><span class="n">bufferingArg</span><span class="p">,</span> <span class="n">out</span> <span class="n">var</span> <span class="n">selectedBuffering</span><span class="p">))</span> + <span class="p">{</span> + <span class="k">switch</span> <span class="p">(</span><span class="n">selectedBuffering</span><span class="p">)</span> + <span class="p">{</span> + <span class="k">case</span> <span class="n">Buffering</span><span class="p">.</span><span class="nl">Buffered:</span> + <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBufferedTransport</span><span class="p">(</span><span class="n">transport</span><span class="p">);</span> + <span class="k">break</span><span class="p">;</span> + + <span class="k">case</span> <span class="n">Buffering</span><span class="p">.</span><span class="nl">Framed:</span> + <span class="n">transport</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TFramedTransport</span><span class="p">(</span><span class="n">transport</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="c1">// layered transport(s) are optional</span> + <span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">selectedBuffering</span> <span class="o">==</span> <span class="n">Buffering</span><span class="p">.</span><span class="n">None</span><span class="p">,</span> <span class="s">"unhandled case"</span><span class="p">);</span> + <span class="k">break</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="k">return</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="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> @@ -319,6 +363,9 @@ h2:hover > .headerlink, h3:hover > .head <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"><</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">TProtocol</span><span class="o">></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">default</span><span class="o">:</span> + <span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="kc">false</span><span class="p">,</span> <span class="s">"unhandled case"</span><span class="p">);</span> + <span class="k">break</span><span class="p">;</span> <span class="p">}</span> <span class="p">}</span> @@ -407,52 +454,6 @@ h2:hover > .headerlink, h3:hover > .head <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">"{client.ClientId} CalculateAsync(1)"</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">"{client.ClientId} 15-10={diff}"</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">"{client.ClientId} Invalid operation: "</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">"{client.ClientId} GetStructAsync(1)"</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">"{client.ClientId} Check log: {log.Value}"</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">"{client.ClientId} ZipAsync() with delay 100mc on server side"</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">"{client.ClientId} SharedService GetStructAsync(1)"</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">"{client.ClientId} SharedService Value: {log.Value}"</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'> @@ -494,17 +495,23 @@ h2:hover > .headerlink, h3:hover > .head <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">using</span> <span class="n">System</span><span class="p">.</span><span class="n">Diagnostics</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">private</span> <span class="k">static</span> <span class="n">ServiceCollection</span> <span class="n">ServiceCollection</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ServiceCollection</span><span class="p">();</span> + <span class="k">private</span> <span class="k">static</span> <span class="n">ILogger</span> <span class="n">Logger</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="n">ServiceCollection</span><span class="p">.</span><span class="n">AddLogging</span><span class="p">(</span><span class="n">logging</span> <span class="o">=></span> <span class="n">ConfigureLogging</span><span class="p">(</span><span class="n">logging</span><span class="p">));</span> + <span class="n">Logger</span> <span class="o">=</span> <span class="n">ServiceCollection</span><span class="p">.</span><span class="n">BuildServiceProvider</span><span class="p">().</span><span class="n">GetService</span><span class="o"><</span><span class="n">ILoggerFactory</span><span class="o">></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">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">=></span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-help"</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> @@ -524,6 +531,13 @@ h2:hover > .headerlink, h3:hover > .head <span class="n">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="s">"Server stopped"</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">ConfigureLogging</span><span class="p">(</span><span class="n">ILoggingBuilder</span> <span class="n">logging</span><span class="p">)</span> + <span class="p">{</span> + <span class="n">logging</span><span class="p">.</span><span class="n">SetMinimumLevel</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">logging</span><span class="p">.</span><span class="n">AddConsole</span><span class="p">();</span> + <span class="n">logging</span><span class="p">.</span><span class="n">AddDebug</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">"</span> @@ -531,17 +545,20 @@ h2:hover > .headerlink, h3:hover > .head <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"><</span><span class="n">transport</span><span class="o">></span> <span class="o">-</span><span class="nl">pr:</span><span class="o"><</span><span class="n">protocol</span><span class="o">></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="n">Server</span><span class="p">.</span><span class="n">exe</span> <span class="o">-</span><span class="nl">tr:</span><span class="o"><</span><span class="n">transport</span><span class="o">></span> <span class="o">-</span><span class="nl">bf:</span><span class="o"><</span><span class="n">buffering</span><span class="o">></span> <span class="o">-</span><span class="nl">pr:</span><span class="o"><</span><span class="n">protocol</span><span class="o">></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="p">,</span> <span class="n">no</span> <span class="n">buffering</span><span class="p">,</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">""</span><span class="n">localhost</span><span class="s">""</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">""</span><span class="n">localhost</span><span class="s">""</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">""</span><span class="p">.</span><span class="n">test</span><span class="s">""</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">""</span><span class="nl">localhost:</span><span class="mi">9090</span><span class="s">""</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">""</span><span class="n">localhost</span><span class="s">""</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">""</span><span class="n">localhost</span><span class="s">""</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">bf</span> <span class="p">(</span><span class="n">buffering</span><span class="p">)</span><span class="o">:</span> + <span class="n">none</span> <span class="o">-</span> <span class="p">(</span><span class="k">default</span><span class="p">)</span> <span class="n">no</span> <span class="n">buffering</span> <span class="n">will</span> <span class="n">be</span> <span class="n">used</span> + <span class="n">buffered</span> <span class="o">-</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="n">framed</span> <span class="o">-</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="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> @@ -557,6 +574,7 @@ h2:hover > .headerlink, h3:hover > .head <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">selectedBuffering</span> <span class="o">=</span> <span class="n">GetBuffering</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> @@ -565,7 +583,7 @@ h2:hover > .headerlink, h3:hover > .head <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="n">await</span> <span class="n">RunSelectedConfigurationAsync</span><span class="p">(</span><span class="n">selectedTransport</span><span class="p">,</span> <span class="n">selectedBuffering</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> @@ -578,6 +596,15 @@ h2:hover > .headerlink, h3:hover > .head <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">Buffering</span> <span class="n">GetBuffering</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">buffering</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">=></span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-bf"</span><span class="p">))</span><span class="o">?</span><span class="p">.</span><span class="n">Split</span><span class="p">(</span><span class="s">":"</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="o"><</span><span class="n">Buffering</span><span class="o">></span><span class="p">(</span><span class="n">buffering</span><span class="p">,</span> <span class="n">out</span> <span class="n">var</span> <span class="n">selectedBuffering</span><span class="p">);</span> + + <span class="k">return</span> <span class="n">selectedBuffering</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">=></span> <span class="n">x</span><span class="p">.</span><span class="n">StartsWith</span><span class="p">(</span><span class="s">"-tr"</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">':'</span><span class="p">)</span><span class="o">?</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span> @@ -587,61 +614,67 @@ h2:hover > .headerlink, h3:hover > .head <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="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">Buffering</span> <span class="n">buffering</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">".test"</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="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="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="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="n">TTransportFactory</span> <span class="n">inputTransportFactory</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span> + <span class="n">TTransportFactory</span> <span class="n">outputTransportFactory</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">buffering</span><span class="p">)</span> + <span class="p">{</span> + <span class="k">case</span> <span class="n">Buffering</span><span class="p">.</span><span class="nl">Buffered:</span> + <span class="n">inputTransportFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBufferedTransport</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span> + <span class="n">outputTransportFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBufferedTransport</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span> + <span class="k">break</span><span class="p">;</span> + + <span class="k">case</span> <span class="n">Buffering</span><span class="p">.</span><span class="nl">Framed:</span> + <span class="n">inputTransportFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TFramedTransport</span><span class="p">.</span><span class="n">Factory</span><span class="p">();</span> + <span class="n">outputTransportFactory</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TFramedTransport</span><span class="p">.</span><span class="n">Factory</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="c1">// layered transport(s) are optional</span> + <span class="n">Debug</span><span class="p">.</span><span class="n">Assert</span><span class="p">(</span><span class="n">buffering</span> <span class="o">==</span> <span class="n">Buffering</span><span class="p">.</span><span class="n">None</span><span class="p">,</span> <span class="s">"unhandled case"</span><span class="p">);</span> + <span class="k">break</span><span class="p">;</span> + <span class="p">}</span> + <span class="n">TProtocolFactory</span> <span class="n">inputProtocolFactory</span> <span class="o">=</span> <span class="n">null</span><span class="p">;</span> + <span class="n">TProtocolFactory</span> <span class="n">outputProtocolFactory</span> <span class="o">=</span> <span class="n">null</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="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> @@ -656,20 +689,31 @@ h2:hover > .headerlink, h3:hover > .head <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">"Selected TAsyncServer with {serverTransport} transport, {processor} processor and {inputProtocolFactory} protocol factories"</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">var</span> <span class="n">loggerFactory</span> <span class="o">=</span> <span class="n">ServiceCollection</span><span class="p">.</span><span class="n">BuildServiceProvider</span><span class="p">().</span><span class="n">GetService</span><span class="o"><</span><span class="n">ILoggerFactory</span><span class="o">></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="nl">itProcessorFactory:</span> <span class="k">new</span> <span class="n">TSingletonProcessorFactory</span><span class="p">(</span><span class="n">processor</span><span class="p">),</span> + <span class="nl">serverTransport:</span> <span class="n">serverTransport</span><span class="p">,</span> + <span class="nl">inputTransportFactory:</span> <span class="n">inputTransportFactory</span><span class="p">,</span> + <span class="nl">outputTransportFactory:</span> <span class="n">outputTransportFactory</span><span class="p">,</span> + <span class="nl">inputProtocolFactory:</span> <span class="n">inputProtocolFactory</span><span class="p">,</span> + <span class="nl">outputProtocolFactory:</span> <span class="n">outputProtocolFactory</span><span class="p">,</span> + <span class="nl">logger:</span> <span class="n">loggerFactory</span><span class="p">.</span><span class="n">CreateLogger</span><span class="o"><</span><span class="n">TSimpleAsyncServer</span><span class="o">></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">"Starting the server..."</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> @@ -717,11 +761,16 @@ h2:hover > .headerlink, h3:hover > .head <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">TcpBuffered</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">TcpTls</span><span class="p">,</span> - <span class="n">Framed</span> + <span class="p">}</span> + + <span class="k">private</span> <span class="k">enum</span> <span class="n">Buffering</span> + <span class="p">{</span> + <span class="n">None</span><span class="p">,</span> + <span class="n">Buffered</span><span class="p">,</span> + <span class="n">Framed</span><span class="p">,</span> <span class="p">}</span> <span class="k">private</span> <span class="k">enum</span> <span class="n">Protocol</span> @@ -746,8 +795,11 @@ h2:hover > .headerlink, h3:hover > .head <span class="p">.</span><span class="n">UseUrls</span><span class="p">(</span><span class="s">"http://localhost:9090"</span><span class="p">)</span> <span class="p">.</span><span class="n">UseContentRoot</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="p">.</span><span class="n">UseStartup</span><span class="o"><</span><span class="n">Startup</span><span class="o">></span><span class="p">()</span> + <span class="p">.</span><span class="n">ConfigureLogging</span><span class="p">((</span><span class="n">ctx</span><span class="p">,</span><span class="n">logging</span><span class="p">)</span> <span class="o">=></span> <span class="n">ConfigureLogging</span><span class="p">(</span><span class="n">logging</span><span class="p">))</span> <span class="p">.</span><span class="n">Build</span><span class="p">();</span> + <span class="n">Logger</span><span class="p">.</span><span class="n">LogTrace</span><span class="p">(</span><span class="s">"test"</span><span class="p">);</span> + <span class="n">Logger</span><span class="p">.</span><span class="n">LogCritical</span><span class="p">(</span><span class="s">"test"</span><span class="p">);</span> <span class="n">host</span><span class="p">.</span><span class="n">RunAsync</span><span class="p">(</span><span class="n">cancellationToken</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> @@ -773,8 +825,7 @@ h2:hover > .headerlink, h3:hover > .head <span class="p">}</span> <span class="c1">// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.</span> - <span class="k">public</span> <span class="kt">void</span> <span class="n">Configure</span><span class="p">(</span><span class="n">IApplicationBuilder</span> <span class="n">app</span><span class="p">,</span> <span class="n">IHostingEnvironment</span> <span class="n">env</span><span class="p">,</span> - <span class="n">ILoggerFactory</span> <span class="n">loggerFactory</span><span class="p">)</span> + <span class="k">public</span> <span class="kt">void</span> <span class="n">Configure</span><span class="p">(</span><span class="n">IApplicationBuilder</span> <span class="n">app</span><span class="p">,</span> <span class="n">IHostingEnvironment</span> <span class="n">env</span><span class="p">,</span> <span class="n">ILoggerFactory</span> <span class="n">loggerFactory</span><span class="p">)</span> <span class="p">{</span> <span class="n">app</span><span class="p">.</span><span class="n">UseMiddleware</span><span class="o"><</span><span class="n">THttpServerTransport</span><span class="o">></span><span class="p">();</span> <span class="p">}</span> @@ -835,56 +886,6 @@ h2:hover > .headerlink, h3:hover > .head <span class="n">WhatOp</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">,</span> <span class="n">Why</span> <span class="o">=</span> <span class="s">"Cannot divide by 0"</span> <span class="p">};</span> - - <span class="k">throw</span> <span class="n">io</span><span class="p">;</span> - <span class="p">}</span> - <span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">/</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</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="p">{</span> - <span class="n">var</span> <span class="n">io</span> <span class="o">=</span> <span class="k">new</span> <span class="n">InvalidOperation</span> - <span class="p">{</span> - <span class="n">WhatOp</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">,</span> - <span class="n">Why</span> <span class="o">=</span> <span class="s">"Unknown operation"</span> - <span class="p">};</span> - - <span class="k">throw</span> <span class="n">io</span><span class="p">;</span> - <span class="p">}</span> - <span class="p">}</span> - - <span class="n">var</span> <span class="n">entry</span> <span class="o">=</span> <span class="k">new</span> <span class="n">SharedStruct</span> - <span class="p">{</span> - <span class="n">Key</span> <span class="o">=</span> <span class="n">logid</span><span class="p">,</span> - <span class="n">Value</span> <span class="o">=</span> <span class="n">val</span><span class="p">.</span><span class="n">ToString</span><span class="p">()</span> - <span class="p">};</span> - - <span class="n">_log</span><span class="p">[</span><span class="n">logid</span><span class="p">]</span> <span class="o">=</span> <span class="n">entry</span><span class="p">;</span> - - <span class="k">return</span> <span class="n">await</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">(</span><span class="n">val</span><span class="p">);</span> - <span class="p">}</span> - - <span class="k">public</span> <span class="n">async</span> <span class="n">Task</span> <span class="n">zipAsync</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">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="s">"ZipAsync() with delay 100mc"</span><span class="p">);</span> - <span class="n">await</span> <span class="n">Task</span><span class="p">.</span><span class="n">Delay</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">CancellationToken</span><span class="p">.</span><span class="n">None</span><span class="p">);</span> - <span class="p">}</span> - <span class="p">}</span> - - <span class="k">public</span> <span class="k">class</span> <span class="nc">SharedServiceAsyncHandler</span> <span class="o">:</span> <span class="n">SharedService</span><span class="p">.</span><span class="n">IAsync</span> - <span class="p">{</span> - <span class="k">public</span> <span class="n">async</span> <span class="n">Task</span><span class="o"><</span><span class="n">SharedStruct</span><span class="o">></span> <span class="n">getStructAsync</span><span class="p">(</span><span class="kt">int</span> <span class="n">key</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">Logger</span><span class="p">.</span><span class="n">LogInformation</span><span class="p">(</span><span class="s">"GetStructAsync({0})"</span><span class="p">,</span> <span class="n">key</span><span class="p">);</span> - <span class="k">return</span> <span class="n">await</span> <span class="n">Task</span><span class="p">.</span><span class="n">FromResult</span><span class="p">(</span><span class="k">new</span> <span class="n">SharedStruct</span><span class="p">()</span> - <span class="p">{</span> - <span class="n">Key</span> <span class="o">=</span> <span class="n">key</span><span class="p">,</span> - <span class="n">Value</span> <span class="o">=</span> <span class="s">"GetStructAsync"</span> - <span class="p">});</span> - <span class="p">}</span> - <span class="p">}</span> - <span class="p">}</span> -<span class="p">}</span> </pre></div> <p class='snippet_footer'>
Modified: websites/staging/thrift/trunk/content/tutorial/nodejs.html ============================================================================== --- websites/staging/thrift/trunk/content/tutorial/nodejs.html (original) +++ websites/staging/thrift/trunk/content/tutorial/nodejs.html Wed Oct 16 21:27:43 2019 @@ -253,7 +253,6 @@ h2:hover > .headerlink, h3:hover > .head <span class="nx">zip</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s2">"zip()"</span><span class="p">);</span> - <span class="nx">result</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span> <span class="p">}</span> <span class="p">});</span> Modified: websites/staging/thrift/trunk/content/tutorial/perl.html ============================================================================== --- websites/staging/thrift/trunk/content/tutorial/perl.html (original) +++ websites/staging/thrift/trunk/content/tutorial/perl.html Wed Oct 16 21:27:43 2019 @@ -200,6 +200,7 @@ h2:hover > .headerlink, h3:hover > .head <span class="n">use</span> <span class="n">lib</span> <span class="s1">'../gen-perl'</span><span class="p">;</span> <span class="n">use</span> <span class="no">Thrift</span><span class="o">::</span><span class="no">Socket</span><span class="p">;</span> <span class="n">use</span> <span class="no">Thrift</span><span class="o">::</span><span class="no">Server</span><span class="p">;</span> +<span class="n">use</span> <span class="no">Thrift</span><span class="o">::</span><span class="no">ServerSocket</span><span class="p">;</span> <span class="n">use</span> <span class="n">tutorial</span><span class="o">::</span><span class="no">Calculator</span><span class="p">;</span> <span class="n">package</span> <span class="no">CalculatorHandler</span><span class="p">;</span> @@ -259,7 +260,6 @@ h2:hover > .headerlink, h3:hover > .head <span class="n">my</span> <span class="vg">$log</span> <span class="o">=</span> <span class="n">shared</span><span class="o">::</span><span class="no">SharedStruct</span><span class="o">-></span><span class="kp">new</span><span class="p">();</span> <span class="vg">$log</span><span class="o">-></span><span class="n">key</span><span class="p">(</span><span class="vg">$logid</span><span class="p">);</span> - <span class="vg">$log</span><span class="o">-></span><span class="n">value</span><span class="p">(</span><span class="n">int</span><span class="p">(</span><span class="vg">$val</span><span class="p">));</span> </pre></div> <p class='snippet_footer'> Modified: websites/staging/thrift/trunk/content/tutorial/php.html ============================================================================== --- websites/staging/thrift/trunk/content/tutorial/php.html (original) +++ websites/staging/thrift/trunk/content/tutorial/php.html Wed Oct 16 21:27:43 2019 @@ -121,7 +121,7 @@ h2:hover > .headerlink, h3:hover > .head <span class="nb">error_reporting</span><span class="p">(</span><span class="k">E_ALL</span><span class="p">);</span> -<span class="k">require_once</span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/../../lib/php/lib/ClassLoader/ThriftClassLoader.php'</span><span class="p">;</span> +<span class="k">require_once</span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/../../vendor/autoload.php'</span><span class="p">;</span> <span class="k">use</span> <span class="nx">Thrift\ClassLoader\ThriftClassLoader</span><span class="p">;</span> @@ -129,8 +129,8 @@ h2:hover > .headerlink, h3:hover > .head <span class="nv">$loader</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ThriftClassLoader</span><span class="p">();</span> <span class="nv">$loader</span><span class="o">-></span><span class="na">registerNamespace</span><span class="p">(</span><span class="s1">'Thrift'</span><span class="p">,</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">'/../../lib/php/lib'</span><span class="p">);</span> -<span class="nv">$loader</span><span class="o">-></span><span class="na">registerDefinition</span><span class="p">(</span><span class="s1">'shared'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span> -<span class="nv">$loader</span><span class="o">-></span><span class="na">registerDefinition</span><span class="p">(</span><span class="s1">'tutorial'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span> +<span class="nv">$loader</span><span class="o">-></span><span class="na">registerNamespace</span><span class="p">(</span><span class="s1">'shared'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span> +<span class="nv">$loader</span><span class="o">-></span><span class="na">registerNamespace</span><span class="p">(</span><span class="s1">'tutorial'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span> <span class="nv">$loader</span><span class="o">-></span><span class="na">register</span><span class="p">();</span> <span class="cm">/*</span> @@ -231,7 +231,7 @@ h2:hover > .headerlink, h3:hover > .head <span class="nb">error_reporting</span><span class="p">(</span><span class="k">E_ALL</span><span class="p">);</span> -<span class="k">require_once</span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/../../lib/php/lib/ClassLoader/ThriftClassLoader.php'</span><span class="p">;</span> +<span class="k">require_once</span> <span class="nx">__DIR__</span><span class="o">.</span><span class="s1">'/../../vendor/autoload.php'</span><span class="p">;</span> <span class="k">use</span> <span class="nx">Thrift\ClassLoader\ThriftClassLoader</span><span class="p">;</span> @@ -239,8 +239,8 @@ h2:hover > .headerlink, h3:hover > .head <span class="nv">$loader</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ThriftClassLoader</span><span class="p">();</span> <span class="nv">$loader</span><span class="o">-></span><span class="na">registerNamespace</span><span class="p">(</span><span class="s1">'Thrift'</span><span class="p">,</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">'/../../lib/php/lib'</span><span class="p">);</span> -<span class="nv">$loader</span><span class="o">-></span><span class="na">registerDefinition</span><span class="p">(</span><span class="s1">'shared'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span> -<span class="nv">$loader</span><span class="o">-></span><span class="na">registerDefinition</span><span class="p">(</span><span class="s1">'tutorial'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span> +<span class="nv">$loader</span><span class="o">-></span><span class="na">registerNamespace</span><span class="p">(</span><span class="s1">'shared'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span> +<span class="nv">$loader</span><span class="o">-></span><span class="na">registerNamespace</span><span class="p">(</span><span class="s1">'tutorial'</span><span class="p">,</span> <span class="nv">$GEN_DIR</span><span class="p">);</span> <span class="nv">$loader</span><span class="o">-></span><span class="na">register</span><span class="p">();</span> <span class="cm">/*</span>