Compare commits

...

684 Commits

Author SHA1 Message Date
James Newton-King 4ee90d83ce
Add .NET 10 target (#2653) 2025-08-06 09:06:27 +08:00
James Newton-King fc1f6db9fd
Support reading compressed grpc-web trailing headers (#2650) 2025-08-05 08:25:32 +08:00
Miha Zupan f31cd71abf
Update docs and startvs for slnx (#2649) 2025-07-25 07:44:33 +08:00
James Newton-King 0045d7d123
Add more options to perf client (#2648) 2025-07-25 07:44:16 +08:00
Shimmy d07efb500c
Add protobuf-net code-first to README.md (#2644)
Co-authored-by: James Newton-King <james@newtonking.com>
2025-06-26 08:39:36 +08:00
dependabot[bot] 9764314a84
Bump pbkdf2 from 3.1.2 to 3.1.3 in /examples/Spar/Server/ClientApp (#2642)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-24 13:43:24 +08:00
James Newton-King 3bd324e325
Fix shared code (#2640) 2025-06-24 11:39:09 +08:00
dependabot[bot] add543720d
Bump brace-expansion in /testassets/InteropTestsGrpcWebWebsite/Tests (#2639)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-13 11:10:16 +08:00
James Newton-King 44b243fb00
MapGrpcService with service definition refactor (#2634)
Co-authored-by: aka-nse <nakase.d1220@gmail.com>
2025-06-13 09:23:01 +08:00
dependabot[bot] 66df240b07
Bump tar-fs in /testassets/InteropTestsGrpcWebWebsite/Tests (#2636)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-06-13 09:00:08 +08:00
James Newton-King 1cb0fdb29a
Migrate from sln to slnx (#2635) 2025-05-30 11:24:19 +08:00
Casper Verhaar 85787a7ce2
Remove reference to obsolete property from Readme and mention alternative (#2631) 2025-05-29 11:56:14 +08:00
James Newton-King d170b24e9d
Update NuGet package versions (#2620) 2025-04-10 08:45:17 +08:00
apolcyn b1af190d8c
bump tools package to 2.71 (#2621) 2025-04-09 15:17:09 -07:00
James Newton-King 6f03f0e0b5
Fix race condition that caused inprogress connect to be canceled (#2618) 2025-04-09 21:06:56 +08:00
dependabot[bot] 30553b5624
Bump tar-fs in /testassets/InteropTestsGrpcWebWebsite/Tests (#2619)
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 3.0.6 to 3.0.8.
- [Commits](https://github.com/mafintosh/tar-fs/compare/v3.0.6...v3.0.8)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 3.0.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-09 18:09:07 +08:00
dependabot[bot] 2aed7b5ef3
Bump @babel/helpers in /testassets/InteropTestsGrpcWebWebsite/Tests (#2616)
Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.25.0 to 7.27.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.0/packages/babel-helpers)

---
updated-dependencies:
- dependency-name: "@babel/helpers"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-09 17:07:45 +08:00
dependabot[bot] 06cd2a9f7a
Bump axios in /testassets/InteropTestsGrpcWebWebsite/Tests (#2615)
Bumps [axios](https://github.com/axios/axios) from 1.7.4 to 1.8.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.4...v1.8.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-09 17:07:32 +08:00
James Newton-King 5816e69828
Remove old dotnet-core feed (#2611) 2025-03-07 07:33:39 +08:00
apolcyn 147a4647ad
bump Grpc.Tools dep (#2603) 2025-02-25 14:46:09 +08:00
James Newton-King 852a118c7b
Move updating connectivity state outside of subchannel lock (#2601) 2025-02-25 08:19:30 +08:00
dependabot[bot] 60d9d2ce15
Bump elliptic from 6.6.0 to 6.6.1 in /examples/Spar/Server/ClientApp (#2599)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-19 07:28:54 +08:00
James Newton-King a2f7d06e02
Avoid using ConcurrentDictionary for channels with few methods (#2597)
Co-authored-by: Günther Foidl <gue@korporal.at>
2025-02-19 07:17:50 +08:00
James Newton-King c9d26719e8
Complete health checks watch service on server shutting down (#2582) 2024-12-12 10:17:08 +08:00
Henrik b7af033360
Performance microoptimizations (#2558)
Co-authored-by: James Newton-King <james@newtonking.com>
2024-12-09 18:03:21 +08:00
Dexter Ajoku 6a3c9774f6
Refactor: Use `await using` for `packageVersionStream` to ensure proper disposal of async resources (#2521) 2024-12-09 08:54:24 +08:00
subhraOffGit cacf59d942
[vote]Added Active maintainers into MAINTAINERS.md. (#2449) 2024-12-09 08:49:13 +08:00
dependabot[bot] be98a74f68
Bump cross-spawn from 7.0.3 to 7.0.6 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2574)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-09 08:48:58 +08:00
dependabot[bot] 42593dde65
Bump vue from 2.6.14 to 3.0.0 in /examples/Spar/Server/ClientApp (#2565)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-09 08:48:20 +08:00
Henrik 651a0cb64a
Correctness: Make some private & internal classes sealed where possible (#2559) 2024-12-09 08:38:01 +08:00
Weihan Li 3bf19a113c
use nameof for CallerArgumentExpression (#2562) 2024-12-09 08:36:19 +08:00
Weihan Li b6cfbd05e9
update ArgumentNullException.ThrowIfNull usage (#2563) 2024-12-09 08:35:21 +08:00
James Newton-King 5a58c24efc
Update to .NET 9 RTM (#2571) 2024-11-15 06:47:13 +08:00
dependabot[bot] dacb7b41ea
Bump elliptic from 6.5.7 to 6.6.0 in /examples/Spar/Server/ClientApp (#2567)
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.7 to 6.6.0.
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.7...v6.6.0)

---
updated-dependencies:
- dependency-name: elliptic
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-10-31 13:34:00 +08:00
James Newton-King 1732f28dc6
Update package dependencies to 9.0 RC2 (#2560) 2024-10-24 04:06:42 +08:00
James Newton-King 5fffc489f7
Fix System.Text.Json vulnerability warning (#2556) 2024-10-11 06:51:57 +08:00
James Newton-King b88713e83f
Update Grpc.Tools to 2.67.0 (#2554) 2024-10-09 13:52:55 +08:00
James Newton-King 0f2ffdc03e
Fix UpdateBalancingState not called when address attributes are modified (#2553) 2024-10-09 10:01:33 +08:00
James Newton-King 490894cded
Cleanup gRPC unit testing helpers in tester sample (#2548) 2024-10-02 08:10:26 +08:00
James Newton-King df3d8dc996
Update to Grpc.Tools 2.67.0-pre1 (#2547) 2024-10-01 14:24:32 +08:00
dependabot[bot] b1df3e4c76
Bump serve-static from 1.14.2 to 1.16.2 in /examples/Spar/Server/ClientApp (#2536)
Bumps [serve-static](https://github.com/expressjs/serve-static) from 1.14.2 to 1.16.2.
- [Release notes](https://github.com/expressjs/serve-static/releases)
- [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md)
- [Commits](https://github.com/expressjs/serve-static/compare/v1.14.2...v1.16.2)

---
updated-dependencies:
- dependency-name: serve-static
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-16 21:54:20 +08:00
Noam Greenberg de9a82fe8e
Update logging to use generated logs (#2531) 2024-09-12 22:31:10 +08:00
James Newton-King 3ed9fb9f31
Log server cancellation errors at info level (#2527) 2024-09-07 14:08:46 +08:00
Varorbc 5322d6b813
precompile condition clean (#2528) 2024-09-07 14:08:07 +08:00
dependabot[bot] 439a3b80b5
Bump micromatch from 4.0.7 to 4.0.8 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2524)
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.7 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.7...4.0.8)

---
updated-dependencies:
- dependency-name: micromatch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-06 07:52:06 +08:00
dependabot[bot] b3429b9061
Bump elliptic from 6.5.4 to 6.5.7 in /examples/Spar/Server/ClientApp (#2525)
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.4 to 6.5.7.
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.5.7)

---
updated-dependencies:
- dependency-name: elliptic
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-06 07:51:42 +08:00
dependabot[bot] 30255261ad
Bump webpack from 5.76.0 to 5.94.0 in /examples/Browser/Server/wwwroot (#2522)
Bumps [webpack](https://github.com/webpack/webpack) from 5.76.0 to 5.94.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.76.0...v5.94.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-09-06 07:28:04 +08:00
apolcyn bf41c89ace
Bump grpc.tools version to 2.66 (#2523) 2024-09-06 07:03:01 +08:00
James Newton-King e9cc7e1579
Add HTTP version configuration to GrpcChannelOptions (#2514)
Co-authored-by: Andrew Casey <amcasey@users.noreply.github.com>
2024-08-22 07:53:14 +08:00
apolcyn 26227c3e7a
[testing] improve sanity check in jwt_token_creds interop test (#2513) 2024-08-21 10:06:52 +08:00
James Newton-King dd4adce098
Fix Google auth interop test (#2512)
* Downgrade Google auth

* Suppress warning

* 1.57.0

* Update to latest and improve test
2024-08-20 13:36:36 -07:00
James Newton-King c397bc7804
Remove internal_ci flag from interop test script (#2509) 2024-08-16 17:13:23 +08:00
James Newton-King 74ee5f0ebf
Update puppeteer (#2507) 2024-08-15 08:23:06 +08:00
dependabot[bot] a732f517ea
Bump axios from 1.6.2 to 1.7.4 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2505)
Bumps [axios](https://github.com/axios/axios) from 1.6.2 to 1.7.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.2...v1.7.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-14 12:20:47 +08:00
dependabot[bot] a156ca9955
Bump braces from 3.0.2 to 3.0.3 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2504)
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-08-14 12:20:29 +08:00
Sébastien Ros cd875d9097
Update .NET 9 SDK and resolve warnings (#2502)
Co-authored-by: James Newton-King <james@newtonking.com>
2024-08-14 12:08:04 +08:00
Mayuki Sawatari 540e87bf70
Fix failure to create GrpcChannel under Wine compatibility layer (including Steam Proton and Apple Game Porting Toolkit) (#2496) 2024-07-30 11:21:36 +08:00
Stanley Cheung b34d553e44
Bump version on master to 2.66.0-dev (#2491) 2024-07-19 18:39:01 -07:00
Stanley Cheung 35b63dad57
Bump Grpc.Tools version to 2.65.0 (#2488) 2024-07-19 16:37:17 +08:00
James Newton-King 6448783899
Reduce usage of RunContinuationsAsynchronously (#2478) 2024-07-11 22:48:10 +08:00
Stanley Cheung aab5b2b798
Bump master version to 2.65.0-dev (#2472) 2024-06-28 13:52:12 -07:00
William Rall 4623318100
Update Native.DetectWindowsVersion() to consider Windows Server 2019 to be Window Server (#2468) 2024-06-26 16:04:45 +08:00
James Newton-King 1416340c85
Fix flaky ConnectTimeout_MultipleCalls_AttemptReconnect test (#2460) 2024-06-13 11:18:15 +08:00
James Newton-King 64f6a0958a
Update repo for .NET 9 (#2457) 2024-06-13 11:05:43 +08:00
James Newton-King 434a5ba26b
Add WriteResponseHeadersAsync test (#2452)
Co-authored-by: Brennan <brecon@microsoft.com>
2024-06-07 07:43:13 +08:00
James Newton-King 5e6821cbe3
Change functional tests to use dynamic ports (#2458) 2024-06-07 06:29:20 +08:00
James Newton-King b57c87f2a9
Update Grpc.Tools to 2.64.0 (#2456) 2024-06-06 08:50:18 +08:00
James Newton-King 775d1fba1c
Update various package versions (#2453) 2024-06-06 08:14:59 +08:00
James Newton-King 0ea0112ec8
Assign primary handler before other configuration (#2445) 2024-06-05 10:07:47 +08:00
James Newton-King 84a4fcb697
Support some HttpClientAction settings and log debug message instead of an error (#2448) 2024-06-05 06:43:36 +08:00
Weihan Li bca64852ba
build: configure rollForward in global.json (#2437) 2024-05-30 12:07:35 +08:00
Weihan Li ef1f0d209c
ci: upgrade checkout action version (#2434)
upgrade checkout action version to fix the ci build warning
2024-05-09 12:24:17 +08:00
Weihan Li 9ad10a9196
doc: fix typo (#2431) 2024-05-09 07:27:20 +08:00
Weihan Li 4b6ecea955
doc: fix typo (#2432)
fix `algorithm` typo
2024-05-08 20:38:41 +08:00
apolcyn 989420e709
Update Grpc.Tools to 2.63 (#2429) 2024-05-07 16:18:49 -07:00
James Newton-King c80f4594d0
Don't capture async locals in resolver (#2426) 2024-05-03 07:06:05 +08:00
James Newton-King 63914f2653
Add semaphore to limit subchannel connect to prevent race conditions (#2422) 2024-04-30 18:38:27 +08:00
James Newton-King 8199f66422
Fix HTTP/3 test errors on .NET 6 (#2423) 2024-04-29 20:37:40 +08:00
James Newton-King 2d9df5892c
Fix memory leak when using call context propagation with cancellation token (#2421) 2024-04-29 20:37:31 +08:00
James Newton-King c9c902c8da
Enable multiple connections with WinHttpHandler by default (#2416) 2024-04-19 06:53:25 +08:00
Drew Noakes 2a36215697
Fix ObjectDisposedException message (#2415) 2024-04-17 15:44:04 +08:00
Weihan Li 9cd97cebca
support `ReadAllAsync` for netstandard2.0 (#2411)
Co-authored-by: James Newton-King <james@newtonking.com>
2024-04-17 15:27:33 +08:00
James Thompson c04d01a0ac
#2401 Add new TFM's so package dependency can be removed (#2402)
Co-authored-by: James Newton-King <james@newtonking.com>
2024-04-17 15:26:43 +08:00
Weihan Li add886e45b
Update Directory.Packages.props (#2413)
Co-authored-by: James Newton-King <james@newtonking.com>
2024-04-17 14:24:11 +08:00
James Newton-King f2709f1bf5
Interrupt existing subchannel connect attempt when reconnect is requested (#2410) 2024-04-13 13:39:16 +08:00
Jakub Januszkiewicz a4d83f6d75
fix a couple typos in README.md (#2397) 2024-04-12 20:49:48 +08:00
James Newton-King a51fec8ff1
Update microsoft-support.md (#2403) 2024-04-05 06:09:28 +08:00
dependabot[bot] 874cd11637
Bump follow-redirects from 1.15.4 to 1.15.6 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2392)
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-19 08:27:13 +08:00
James Newton-King 933023b6f8
Prevent block inside ResolveAsync from blocking PollingResolver.Refresh (#2385) 2024-03-12 15:50:49 +08:00
apolcyn f29d927f42
update Grpc.Tools version to 2.62 (#2382) 2024-03-07 15:50:17 -08:00
James Newton-King 098dca892a
Fix OS detection error in UWP (#2376) 2024-02-27 10:27:13 +08:00
Sébastien Ros 787faa64c7
Set default streams value in grpc-client.yml (#2379) 2024-02-27 08:08:33 +08:00
apolcyn da2038226c
Merge pull request #2370 from apolcyn/bump_branch
Bump Grpc.Tools to 1.61.0
2024-02-07 16:52:00 -08:00
Alexander Polcyn 7cd4bc2447 bump Grpc.Tools 2024-02-07 21:07:42 +00:00
Tom Kerkhove 6d1ea08ce3
proposal: Build changelog based on previous stable version (#2269)
Co-authored-by: James Newton-King <james@newtonking.com>
Co-authored-by: Steve Dougherty <steve@asksteved.com>
2024-02-06 08:24:50 +08:00
James Newton-King 1a8435477f
Add missing package mapping for net9 feed (#2366) 2024-02-06 06:39:55 +08:00
James Newton-King 7f5b4574aa
Add .NET 9 NuGet feed (#2365) 2024-01-31 05:39:49 +08:00
James Newton-King 3103c6937f
Allow GrpcChannel to use WinHttpHandler on Windows Server 2019 (#2362) 2024-01-18 08:05:06 +08:00
James Newton-King 0cad7497d0
Add key services tests for service and interceptor (#2356) 2024-01-11 20:18:14 +08:00
dependabot[bot] 4b0b3589db
Bump follow-redirects from 1.15.3 to 1.15.4 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2352)
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.3 to 1.15.4.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.3...v1.15.4)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-09 19:11:24 +08:00
James Newton-King e5c9528912
Grpc.StatusProto clean up (#2349) 2024-01-09 07:59:41 +08:00
James Newton-King abaaf4415c
Add ProtoStatus example (#2273) 2024-01-09 07:59:02 +08:00
tony 934bcec442
First pass at Grpc.StatusProto API (#2205) 2024-01-04 11:03:03 +08:00
James Newton-King f075c79e18
Fix cancellation token reported when using retries (#2345) 2024-01-03 07:29:05 +08:00
Stanley Cheung 87cce280d7
Bump dev version to 2.61.0-dev on master branch (#2337) 2023-12-13 16:52:53 -08:00
James Newton-King 998a8cc63b
Update Grpc.Tools to 2.60.0 (#2336) 2023-12-13 07:36:08 +08:00
James Newton-King 1625f89427
Trim regex from Grpc.AspNetCore (#2326) 2023-11-28 08:37:10 +08:00
James Newton-King 2bbb977dd2
Add Native AOT test (#2324) 2023-11-21 09:01:25 +08:00
James Newton-King ca9b756d73
Update to use Directory.Packages.props (#2315) 2023-11-18 12:55:16 +08:00
James Newton-King 4a60f414a1
Update to GA .NET 8 SDK (#2321) 2023-11-17 08:06:17 +08:00
dependabot[bot] e5afb085e0
Bump browserify-sign from 4.2.1 to 4.2.2 in /examples/Spar/Server/ClientApp (#2311)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-16 12:53:14 +08:00
dependabot[bot] 5e505b017a
Bump axios and wait-on in /testassets/InteropTestsGrpcWebWebsite/Tests (#2322)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-16 12:52:53 +08:00
dependabot[bot] 8d33f094d2
Bump @babel/traverse from 7.21.4 to 7.23.2 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2300)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-11-16 12:30:50 +08:00
apolcyn e52049a94d
Merge pull request #2303 from apolcyn/update_59
Update grpc tools to 2.59
2023-10-24 11:56:11 -07:00
Alexander Polcyn 51ad5ab757 update grpc tools to 2.59 2023-10-19 17:06:17 +00:00
dependabot[bot] 3c4abbada1
Bump @babel/traverse from 7.17.3 to 7.23.2 in /examples/Spar/Server/ClientApp (#2298)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-10-18 08:26:41 +08:00
James Newton-King 91be3925c1
Fix HttpContext race by copying values to reader and writer (#2294) 2023-10-18 08:26:12 +08:00
apolcyn 683fbdfa5c
Merge pull request #2290 from apolcyn/bump_deps
Bump GrpcToolsPackageVersion to 2.58.0
2023-10-06 16:41:54 -07:00
Alexander Polcyn bad41ff570 bump GrpcToolsPackageVersion to 2.58.0 2023-10-06 17:07:13 +00:00
James Newton-King 207e8066f3
Dispose socket after connection failure (#2287) 2023-10-03 09:09:49 +08:00
James Newton-King 97f6fbd3fe
Fix detecting inherited WinHttpHandler (#2288) 2023-10-03 09:09:27 +08:00
James Newton-King 7e62218646
Add debugger display to Status (#2281) 2023-09-28 07:14:13 +08:00
James Newton-King 46480fca2f
Remove netstandard1.5 from some projects (#2279) 2023-09-21 21:50:13 +08:00
James Newton-King 40a26c9877
Support disabling load balancing with SocketsHttpHandler.Properties (#2274) 2023-09-12 13:33:15 +08:00
James Newton-King 246c43d457
Add request and channel to call debugging (#2271) 2023-09-06 10:27:29 +08:00
James Newton-King 91130a7c89
Update ServiceBinderBase.AddMethod annotations to allow null handler (#2270) 2023-09-05 21:50:58 +08:00
Jan Tattermusch 3f90844449
Start 2.58 development cycle. (#2267)
* Update version.props

* Update VersionInfo.cs
2023-08-31 16:17:08 +02:00
James Newton-King b50e46f851
Fix connection bugs from BalancerAddress changes (#2265) 2023-08-31 08:09:32 +08:00
James Newton-King 311f8784c6
Change subchannel BalancerAddress when attributes change (#2228) 2023-08-30 11:56:19 +08:00
James Newton-King b421751176
Fix unobserved exceptions with retries (#2255) 2023-08-29 09:19:51 +08:00
James Newton-King 41f67ad900
Log socket lifetime when closing unusable sockets (#2258) 2023-08-26 10:22:53 +08:00
James Newton-King a9e810c3df
Update call debugger display to show status code (#2259) 2023-08-26 10:21:57 +08:00
James Newton-King 6429ae2f57
Reduce logger allocations by not using generic CreateLogger (#2256) 2023-08-26 10:21:12 +08:00
James Newton-King 3db1683820
Add transport status to subchannel picked log (#2261) 2023-08-26 09:30:59 +08:00
Jan Tattermusch 01049834be
Update Grpc.Tools dependency to 2.57.0 (#2257) 2023-08-25 10:47:38 +02:00
James Newton-King ca3f2b9d51
Change subchannel ID to include a channel ID (#2253) 2023-08-24 20:50:24 +08:00
Jan Tattermusch aa2bc14f5e
upgrade QpsWorker to net8 (#2250) 2023-08-22 10:48:51 +02:00
James Newton-King a970fec15d
Clear IAsyncStreamReader<T>.Current value before reading next value (#2248) 2023-08-21 11:31:46 +08:00
James Newton-King 89dd217257
Update Grpc.Net.Client to use ActivitySource (#2244) 2023-08-18 07:37:19 +08:00
James Newton-King 2b1da779bf
Force yielding after awaiting CallTask to avoid holding onto locks (#2245) 2023-08-16 09:05:50 +08:00
dependabot[bot] 6ca24ef45b
Bump semver from 6.3.0 to 6.3.1 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2243)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-08-15 11:57:15 +08:00
James Newton-King 5a8e2baf37
Update to use .NET 8 (#2021) 2023-08-15 10:19:29 +08:00
James Newton-King 854e0fd3d0
Update implementation_comparison.md (#2240) 2023-08-12 10:58:05 +08:00
James Newton-King 22a9549897
Update OS version detection to get version directly from Windows (#2239) 2023-08-12 08:17:32 +08:00
James Newton-King 870bf8443f
Improve comment in GrpcChannel for WinHttpHandler + OS validation (#2237) 2023-08-10 09:07:28 +08:00
James Newton-King 89e6611d2d
Fix load balancing flaky test (#2223) 2023-08-10 08:34:02 +08:00
James Newton-King a61e11f1e0
Consistently don't log message errors on cancellation (#2221) 2023-08-10 08:31:58 +08:00
James Newton-King d49fbe40d5
Update Newtonsoft.Json to 13.0.3 (#2219) 2023-08-10 08:31:45 +08:00
James Newton-King 4367702140
Update Grpc.Net.Client to remove ValueTask usage (#2222) 2023-08-10 07:43:31 +08:00
James Newton-King d305ee4bc6
Improve BalancerAttributes debugging (#2235) 2023-08-07 21:08:50 +08:00
James Newton-King 19e059f073
Support infinite idle connection timeout values (#2231) 2023-08-06 22:04:44 +08:00
James Newton-King cec98b28d5
Validate Windows version when using WinHttpHandler (#2229) 2023-08-04 16:59:10 +08:00
Jan Tattermusch 6420a8cf9f
Start 2.57.x development cycle (#2227)
* Update version.props

* Update VersionInfo.cs
2023-08-04 10:10:34 +02:00
Stephen Toub 6a4bca703a
Add net462 build to Grpc.Net.Client with WinHttpHandler default (#2220) 2023-08-02 10:53:02 +08:00
James Newton-King a2d005c86b
Correctly check socket on stream creation (#2215) 2023-08-02 09:34:21 +08:00
James Newton-King 1d1234064c
Support idle connection timeout with pending sockets (#2213) 2023-07-28 22:43:23 +08:00
James Newton-King 0ab3ada34a
Fix gRPC client retry deadlock (#2209) 2023-07-26 14:35:41 +08:00
James Newton-King bff852c7f1
Improve gRPC channel and client debugging (#2196) 2023-07-25 08:37:57 +08:00
James Newton-King e0677497de
Update SocketConnectivitySubchannelTransport.cs (#2202) 2023-07-25 08:19:29 +08:00
James Newton-King 03d9b01fbb
Socket transport: Don't close socket on available data (#2179) 2023-07-21 09:26:03 +08:00
Theodore Tsirpanis 6307ca7ead
Remove System.Memory dependency on .NET Standard 2.1 in Grpc.Core.Api. (#2186)
Co-authored-by: James Newton-King <james@newtonking.com>
2023-07-20 15:45:53 +08:00
dependabot[bot] 8275c602a9
Bump semver from 6.3.0 to 6.3.1 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2189)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-20 09:36:15 +08:00
dependabot[bot] 1e32a39efa
Bump tough-cookie from 4.0.0 to 4.1.3 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2187)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-20 08:45:44 +08:00
dependabot[bot] 5751c4dd3e
Bump word-wrap from 1.2.3 to 1.2.4 in /examples/Spar/Server/ClientApp (#2198)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-20 08:28:04 +08:00
dependabot[bot] 067bfc8fd8
Bump word-wrap from 1.2.3 to 1.2.4 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2199)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-20 08:27:58 +08:00
James Newton-King d884b50a27
Even better gRPC debugging (#2193) 2023-07-17 18:12:00 +08:00
James Newton-King 85f34398df
Improve grpc-dotnet debugging (#2192) 2023-07-16 20:34:41 +08:00
Jan Tattermusch 16e01b9369
Start 2.56.x development cycle (on master branch) (#2185)
* Update version.props

* Update VersionInfo.cs

* Update dependencies.props
2023-06-30 17:11:08 +02:00
Varorbc 42cc09eb8f
update readme (#2183) 2023-06-28 20:35:35 +08:00
Jan Tattermusch 83d12ea1cb
Update version to 2.55.0-dev (on master branch) (#2177)
* Update version.props

* Update VersionInfo.cs
2023-06-23 14:28:22 +02:00
apolcyn 99604e5a9a
Merge pull request #2175 from apolcyn/revert
Revert "update 2.55 branch to 2.55-pre1"
2023-06-22 17:04:07 -07:00
Alexander Polcyn bc6da06036 Revert "update 2.55 branch to 2.55-pre1"
This reverts commit 266be407f6.
2023-06-22 23:35:39 +00:00
apolcyn 5a2887497e
Merge pull request #2174 from apolcyn/update_255
Update 2.55 branch to 2.55-pre1
2023-06-22 16:34:47 -07:00
Alexander Polcyn 266be407f6 update 2.55 branch to 2.55-pre1 2023-06-22 16:42:01 +00:00
apolcyn c72ada62e6
Update Grpc.Tools to 2.55 (#2171)
Co-authored-by: James Newton-King <james@newtonking.com>
2023-06-22 15:12:31 +08:00
James Newton-King 2be676ad3b
WriteAsync cancellation throws an error with the calls completed status if possible (#2170) 2023-06-22 15:12:17 +08:00
James Newton-King 73c726bf4e
Fix client factory extension method validation issues (#2159) 2023-06-14 19:52:18 +08:00
James Newton-King 697f3492f2
Refactor healthchecks service mapping to support filtering on check (#2142) 2023-06-14 13:11:42 +08:00
James Newton-King ff1a07b90c
Update Google.Protobuf to 3.23.1 (#2136) 2023-06-01 09:24:58 +08:00
James Newton-King 6bc44e97d7
Fix flaky streaming test (#2134) 2023-05-25 11:36:22 +08:00
James Newton-King f9a00bc490
Fix capturing ExecutionContext by timers and background tasks (#2129) 2023-05-17 10:27:38 +08:00
James Newton-King 2dc971e013
Add IReadOnlyDictionary to BalancerAttributes collection (#2121) 2023-05-17 07:17:35 +08:00
apolcyn 1412c31924
Merge pull request #2127 from JamesNK/jamesnk/grpctools-2.54.0
Update Grpc.Tools to 2.54.0
2023-05-16 08:41:46 -07:00
James Newton-King a95f0f08e9
Update Grpc.Tools to 2.54.0 2023-05-16 11:01:03 +08:00
James Newton-King 7786079da6
Fix bugs related to channel dispose while there are active calls (#2120) 2023-05-16 06:00:55 +08:00
James Newton-King 38738af700
Fix missing port from DnsResolver host override value (#2111) 2023-05-05 21:53:03 +08:00
James Newton-King 9427a740a4
Remove host override from container sample (#2109) 2023-05-02 13:26:36 +08:00
James Newton-King b83aece3cf
Make CancellationToken available in call credentials interceptor (#2107) 2023-05-02 06:28:29 +08:00
James Newton-King 8af472314e
Add remove method to balancer attributes collection (#2110) 2023-05-02 06:27:59 +08:00
James Newton-King 94a8167500
Change some gRPC client error logs to debug level (#2106) 2023-04-29 09:11:08 +08:00
Marc Gravell e270f816b4
Enable nullable throughout solution (#2102) 2023-04-27 20:42:51 +08:00
Jan Tattermusch 6bf44820a2
Update version to 2.54.0-dev (on master branch) (#2096)
* Update version.props

* Update VersionInfo.cs
2023-04-12 11:18:04 +02:00
Jan Tattermusch 0998624ce9
Update dependencies.props (#2094) 2023-04-12 10:37:33 +02:00
James Newton-King 54d7f29913
Change proxy detection to log a message (#2087) 2023-04-06 11:29:09 +08:00
James Newton-King b82c0c7354
Fix unobserved exception when using a client interceptor (#2082) 2023-03-22 15:34:37 +08:00
dependabot[bot] fb315ca62b
Bump webpack from 5.75.0 to 5.76.0 in /examples/Browser/Server/wwwroot (#2073)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-21 21:38:22 +08:00
James Newton-King c24dfebe22
Fix .NET 6 trimming constraint constructor (#2080) 2023-03-21 20:48:05 +08:00
James Newton-King 95cf7fc928
Improve error message with invalid headers (#2068) 2023-03-09 18:11:40 +08:00
Jan Tattermusch f056e80af0
Bump version to 2.53.0-dev (on master) (#2067)
* Update version.props

* Update VersionInfo.cs
2023-03-06 08:54:57 +01:00
Jan Tattermusch 23cd81fbdb
Update version to 2.52.0-dev on master (#2063)
* update version to 2.52.0-dev on master

* Update VersionInfo.cs

* Update dependencies.props
2023-03-02 14:50:11 +01:00
James Newton-King cfb839bd7c
Refactor gRPC content-type constraint to be inline (#2065)
* Refactor gRPC content-type constraint to be inline

* Fix tests

* Clean up

* Comment

* Comment
2023-03-02 12:50:26 +01:00
James Newton-King c2274eb07d
Add .editorconfig and fix warnings (#2055) 2023-02-25 21:43:59 +08:00
James Newton-King a456d47405
Wrap EventSource calls with IsEnabled (#2052) 2023-02-21 19:02:16 +08:00
James Newton-King 84718236a9
Update Google.Protobuf version (#2051) 2023-02-21 18:46:26 +08:00
James Newton-King 0b365bf463
Add additional connection and request logging to client (#2047) 2023-02-13 22:17:58 +08:00
dependabot[bot] 0f9300c439
Bump @sideway/formula from 3.0.0 to 3.0.1 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2045)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-02-09 10:16:00 +08:00
James Newton-King ad54bc69ed
Add test that uses localization (#2039) 2023-02-06 11:12:54 +08:00
Pavel Voronin fc4d087d63
Mention Metadata.BinaryHeaderSuffix in xmldoc comments of Metadata.En… (#2027)
Co-authored-by: James Newton-King <james@newtonking.com>
2023-02-05 12:01:14 +08:00
James Newton-King 674758e4d3
Fix gRPC perf client counter (#2035) 2023-02-03 06:38:56 +08:00
James Newton-King 2cdbf1c308
Fix reporting RpcException from server streaming error (#2034) 2023-02-02 07:02:32 +08:00
James Newton-King 4bf9312123
Trimming issue workaround in .NET 8 (#2022) 2023-01-20 08:34:44 +08:00
James Newton-King 0a26b0cad6
Report user canceled cancellation token (#2018)
Co-authored-by: Brennan <brecon@microsoft.com>
2023-01-18 11:01:31 +08:00
James Newton-King b81a92d17b
Don't warn about Android native handler with grpc-web (#2020) 2023-01-18 09:01:41 +08:00
James Newton-King 4c07771aea
Update microsoft-support.md (#2009) 2023-01-18 06:45:04 +08:00
James Newton-King 948be08b08
Fix wrong namespace (#2015) 2023-01-11 20:15:12 +08:00
James Newton-King 96ea3836b4
Support zero-byte read in gRPC client (#1985) 2023-01-11 10:35:00 +08:00
James Newton-King 33f6ae36c9
Set WaitForDataBeforeAllocatingBuffer to false in benchmark app (#2012) 2023-01-09 07:42:50 +08:00
James Newton-King b92eb109f1
Add host override to resolvers (#2002) 2023-01-06 08:14:57 +08:00
James Newton-King f7e186f18e
Support running health checks in Check method (#1987) 2023-01-06 07:44:21 +08:00
James Newton-King 2ea8177bc8
Fix reconnecting after connection timeout (#1998) 2023-01-05 07:08:04 +08:00
James Newton-King 3a356b3719
Add client factory to client linker test app (#1972) 2023-01-05 07:04:10 +08:00
dependabot[bot] ff89215fbc
Bump json5 from 1.0.1 to 1.0.2 in /examples/Spar/Server/ClientApp (#2007)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-04 09:41:27 +08:00
dependabot[bot] 9ab0b4508f
Bump json5 from 2.2.0 to 2.2.3 in /testassets/InteropTestsGrpcWebWebsite/Tests (#2005)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-04 09:41:19 +08:00
dependabot[bot] d2c8146302
Bump json5, webpack and webpack-cli in /examples/Browser/Server/wwwroot (#2003)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-01-04 09:32:44 +08:00
Jan Tattermusch d2c5a7a5b9
Additional dependency version cleanup (after moving some nuget packages to from grpc to grpc-dotnet) (#1786) 2023-01-04 09:21:59 +08:00
James Newton-King 8474b75b41
Support writing to response stream with gRPC-Web middleware (#1993) 2022-12-21 07:03:54 +08:00
Jan Tattermusch d4704d8f44
RpcException API improvements (#1992)
* RpcException: include status.DebugException as InnerException

* make Status.ToString() less verbose

* add tests

* Apply suggestions from code review

Co-authored-by: James Newton-King <james@newtonking.com>

Co-authored-by: James Newton-King <james@newtonking.com>
2022-12-20 19:44:26 +01:00
James Newton-King 11e7cfa3da
Update MAINTAINERS.md (#1979) 2022-12-15 10:54:33 +01:00
James Newton-King 1a9cf64a72
Cancel pending state change watchers on dispose (#1986) 2022-12-13 09:58:44 +08:00
James Newton-King 5a0b1eec01
Skip active connections when proxy is configured (#1863) 2022-12-08 16:23:24 +08:00
James Newton-King 17ef8fdbe5
Make ChannelCredentials.Create work with allowing insecure credentials (#1802) 2022-12-08 11:01:49 +08:00
dependabot[bot] cb88ac90ca
Bump decode-uri-component from 0.2.0 to 0.2.2 in /examples/Browser/Server/wwwroot (#1976)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-08 11:01:12 +08:00
dependabot[bot] c72d1a82a5
Bump decode-uri-component from 0.2.0 to 0.2.2 in /examples/Spar/Server/ClientApp (#1977)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-12-08 11:00:55 +08:00
James Newton-King 3ae11a4cef
Add logging to resolve to indicate resolve is complete (#1978) 2022-12-08 10:11:43 +08:00
James Newton-King a98c6218e0
Update dotnet-grpc tool to require .NET 6 (#1932) 2022-12-08 07:53:01 +08:00
Jan Tattermusch 664f5559f6
Update version to 2.51.0-dev (on master branch) (#1973)
* update version to 2.51.0-dev

* Update VersionInfo.cs

* Update Grpc.Tools dependency version
2022-12-07 15:54:35 +01:00
Felix Winterhalter e28a43ffed
fix: Fixes missing constructor in trimmed builds (#1970)
Closes https://github.com/grpc/grpc-dotnet/issues/1969
2022-12-07 10:07:22 +08:00
dependabot[bot] bb406e8bfa
Bump minimatch from 3.0.4 to 3.1.2 in /examples/Browser/Server/wwwroot (#1958)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-23 21:08:34 +08:00
dependabot[bot] 80e2fabcf9
Bump loader-utils and webpack-cli in /examples/Browser/Server/wwwroot (#1957)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-11-22 10:20:22 +08:00
James Newton-King 23047e0d49
Change channel transport property to readonly (#1947) 2022-11-16 15:10:09 +08:00
James Newton-King 91ac7754f2
Update to GA .NET 7 SDK (#1943) 2022-11-11 22:15:34 +08:00
James Newton-King faf6234b3d
Add .NET 8 feed to sources (#1940) 2022-11-10 09:39:32 +08:00
Jan Tattermusch 25f7b137d7
Revert "Update version to 2.50.0-pre1 (on v2.50.x branch) (#1935)" (#1936)
This reverts commit 0828c036bb.
2022-11-03 09:07:43 +01:00
James Newton-King 97b7f6d4d7
Improve logging message when gRPC status OK in header (#1931) 2022-11-03 09:29:52 +08:00
Jan Tattermusch 0828c036bb
Update version to 2.50.0-pre1 (on v2.50.x branch) (#1935)
* Update version to 2.50.0-pre1 (on v2.50.x branch)

* Update VersionInfo.cs
2022-11-02 15:43:25 +01:00
Jan Tattermusch 6c48114e67
Update Grpc.Tools dependency to 2.50.0 (#1934) 2022-11-02 10:01:28 +01:00
James Newton-King 7154cb470d
Detect native HttpHandler on Android (#1927) 2022-11-01 16:43:11 +08:00
James Newton-King 4c2e66ed85
Enable AOT analysis and fix warnings (#1924) 2022-10-25 06:12:30 +08:00
James Newton-King 45dd5d171c
Fix build failure on benchmark server V2 (#1920) 2022-10-19 06:15:18 +08:00
James Newton-King 947a24aefe
Upgrade dotnet-grpc dependencies (#1914) 2022-10-18 08:57:10 +08:00
James Newton-King 22ac73b110
Fix build failure on benchmark server (#1913) 2022-10-17 13:09:24 +08:00
dependabot[bot] e7fd8004c0
Bump minimist, minimist and mkdirp in /examples/Browser/Server/wwwroot (#1910)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-12 04:07:42 +08:00
dependabot[bot] e86adbf656
Bump ansi-regex from 3.0.0 to 3.0.1 in /examples/Spar/Server/ClientApp (#1911)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-12 04:07:30 +08:00
dependabot[bot] 3617dc1c78
Bump ansi-regex from 4.1.0 to 4.1.1 in /examples/Browser/Server/wwwroot (#1909)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-10-12 04:07:20 +08:00
James Newton-King cb02fb7e8f
Update transcoder example (#1887) 2022-10-12 03:51:08 +08:00
Brennan ad67dc8d27
Fix grpc benchmark cancellation (#1901) 2022-10-06 07:27:29 +08:00
James Newton-King 456098bcfe
Update Grpc.DotNet.sln to use file scoped namespaces (#1894) 2022-10-05 22:17:09 +08:00
Eduard Llull 371d74fc95
Use the extending class name when throwing ObjectDisposedException (#1890) 2022-09-26 21:50:07 +08:00
Jan Tattermusch 0f5c5782e3
Update Grpc.Core and Grpc.Tools dependencies. (#1892) 2022-09-26 12:26:10 +02:00
James Newton-King 0ab5e2c509
Change examples to use WebApplication V3 (#1878) 2022-09-17 10:28:31 +08:00
James Newton-King 9950fd717b
Fix race condition in flaky test (#1883) 2022-09-14 08:49:46 +08:00
James Newton-King 9852674a88
Fix detecting message accept encoding with whitespace (#1882) 2022-09-14 08:39:39 +08:00
James Newton-King 54fa142547
Change examples to use WebApplication V4 (#1879) 2022-09-13 12:41:50 +08:00
James Newton-King 195e1c0922
Change examples to use WebApplication V2 (#1877) 2022-09-13 12:07:07 +08:00
James Newton-King 7980069be0
Change examples to use WebApplication V1 (#1875) 2022-09-13 10:29:46 +08:00
James Newton-King 884d918e3c
Improve transcoder example with swagger (#1871) 2022-09-05 14:15:27 +08:00
James Newton-King 792eb3b570
Fix using disposed token in connect and resulting status (#1872) 2022-09-01 21:34:21 +08:00
Jan Tattermusch 8ae9c96c18
Update the version to v2.50.0-dev (on master branch) (#1867)
* Update version.props

* Update VersionInfo.cs
2022-09-01 15:25:30 +02:00
James Newton-King 937869c130
Log sync errors in client logger interceptor example (#1868) 2022-08-31 09:39:53 +08:00
James Newton-King 2116d1efce
Configure pooled connection lifetime in client factory (#1862) 2022-08-30 06:31:28 +08:00
James Newton-King 7bfd8e385a
Update solution to .NET 7 (#1803) 2022-08-27 12:42:38 +08:00
James Newton-King 922d314630
Load balancing fix to clear disposed subchannels on resolver error (#1853)
Co-authored-by: Francois Nel <francois.nel@iotnxt.com>
2022-08-26 08:56:09 +08:00
James Newton-King 0551be8b6b
Remove bad deadline test (#1859) 2022-08-26 07:29:27 +08:00
James Newton-King 1d7f98834c
Add Channeler example (#1851) 2022-08-25 09:55:31 +08:00
James Newton-King 4f06b601aa
Change nullable GetValueOrDefault to Value (#1855)
Co-authored-by: Günther Foidl <gue@korporal.at>
2022-08-24 14:20:54 +08:00
Mayuki Sawatari 77ae8af69c
Use PoolingAsyncValueTaskMethodBuilder on ReadStreamMessageAsync method (#1850)
Co-authored-by: James Newton-King <james@newtonking.com>
2022-08-18 13:41:05 +08:00
Jan Tattermusch d250e28e70
Update version to 2.49.0-dev (on master branch) (#1849)
* bump version to 2.49

* Update VersionInfo.cs
2022-08-17 12:59:58 +02:00
Jan Tattermusch 4e9077c9ae
Update Grpc.Tools dependency to 2.48.0 (#1847) 2022-08-17 11:57:15 +02:00
James Newton-King 3934c6c702
Improve tester example to log errors and have non-success test (#1841) 2022-08-12 11:18:29 +08:00
James Newton-King a3717a3587
Add more load balancing logging (#1791) 2022-07-30 16:28:07 +08:00
dependabot[bot] ca40f28ab7
Bump terser from 4.4.3 to 4.8.1 in /examples/Browser/Server/wwwroot (#1827)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-07-30 11:16:38 +08:00
James Newton-King 5ff18048d1
Use SocketsHttpHandler.ConnectTimeout on connect (#1829)
Co-authored-by: Brennan <brecon@microsoft.com>
2022-07-29 20:17:34 +08:00
James Newton-King 9d0919fe05
Use Array.Empty in benchmark when response size is zero (#1819) 2022-07-14 09:27:15 +08:00
James Newton-King c319c44ec8
Add locator example (#1796)
Co-authored-by: Bruno Oliveira <brunolins16@users.noreply.github.com>
2022-07-13 13:51:22 +08:00
James Newton-King 25c2b9115a
Update README.md (#1816) 2022-07-13 06:17:11 +08:00
James Newton-King b77a58963b
Update README.md (#1817) 2022-07-13 06:17:02 +08:00
James Newton-King a984c6d55c
Fix client factory trim warning (#1806) 2022-07-06 06:03:55 +08:00
James Newton-King 7a6e2fe207
Use NuGet package in Vigor example (#1805)
Co-authored-by: Michael Maxwell <mike.ian.maxwell@gmail.com>
2022-07-03 10:36:56 +08:00
Xue Qianming 5f587ae2e0
Don't use sum for latency (#1798) 2022-07-02 08:05:54 +08:00
James Newton-King 6507e9bf37
Update open telemetry packages (#1801) 2022-07-02 07:26:01 +08:00
James Newton-King 2923260a0c
Populate DebugException on some cancellation scenarios (#1780) 2022-06-29 06:08:11 +08:00
James Newton-King de472b186c
Add health service integration test (#1793)
Co-authored-by: Brennan <brecon@microsoft.com>
2022-06-29 06:07:01 +08:00
Jan Tattermusch d9755701cf
Update version to 2.48.0-dev (#1795)
* Update version to 2.48.0-dev

* Update VersionInfo.cs
2022-06-28 13:45:40 +02:00
Jan Tattermusch cbb0836991
Update release_process.md to match the current state of things (#1788) 2022-06-28 10:06:29 +02:00
James Newton-King 78d11d14ad
Fix sharing SocketsHttpHandler between channels (#1792) 2022-06-28 08:07:30 +08:00
Jan Tattermusch 6bbbf36277
Use GrpcToolsPackageVersion property for Grpc.Tools dependencies (#1785)
* introduce new GrpcToolsPackageVersion property

* use GrpcToolsPackageVersion in dotnet-grpc.csproj

* update release_process.md

* update GrpcPackageVersion
2022-06-23 13:28:52 +02:00
James Newton-King 58cd9dc9cb
Fix benchmarks when callCount isn't specified (#1783) 2022-06-23 07:47:08 +08:00
James Newton-King 543c363c5e
Add HTTP event source logging to gRPC benchmark server (#1773) 2022-06-21 12:25:50 +08:00
James Newton-King 2c175e01ca
Pass call count argument to benchmark client (#1772) 2022-06-19 15:11:30 +08:00
James Newton-King f850d75d85
Add HTTP event source logging to gRPC benchmark client (#1771) 2022-06-19 13:53:14 +08:00
Jan Tattermusch 0ddbb72c3e
Revert "Change InteropTestClient to net5.0 (#1514)" (#1765)
This reverts commit d2035de5f6.
2022-06-07 10:11:05 +02:00
James Newton-King c0779fc83f
Validate AddCallCredentials are used by client (#1756) 2022-05-24 18:53:28 +08:00
James Newton-King fedf5ab017
Make getting lazy properties on ServiceConfig threadsafe (#1752)
Co-authored-by: Brennan <brecon@microsoft.com>
2022-05-20 09:16:18 +08:00
James Newton-King 1f5186e6a7
Fix warnings when running benchmarks in .NET 7 (#1749) 2022-05-20 07:37:44 +08:00
James Newton-King 4b10c6c7bf
Transcoder sample clean up (#1753) 2022-05-19 20:36:54 +08:00
Jan Tattermusch e616db6506
Revert "Transcoding example cleanup (#1734)" (#1751)
This reverts commit 9e073cd6e6.
2022-05-18 16:21:17 +02:00
James Newton-King 9e073cd6e6
Transcoding example cleanup (#1734) 2022-05-16 12:51:46 +08:00
James Newton-King 52c6154435
Catch any potential error from deadline callback (#1737) 2022-05-16 12:41:16 +08:00
James Newton-King be641b6ffe
Re-enable trim analysis and fix warnings (#1744) 2022-05-16 12:40:46 +08:00
Daniel Vieira Vega 248c580a7c
Ensuring required services are registered when using the server reflection (#1732) 2022-05-14 20:37:44 +08:00
James Newton-King 7cf2aa077c
Add JSON transcoding example (#1724) 2022-05-11 00:26:19 +08:00
James Newton-King d7cf5a83dd
Add AddCallCredentials overload that actually takes CallCredentials (#1723) 2022-05-09 08:18:50 +08:00
Jan Tattermusch 3f63a9ac94
Run interop tests against another language instead of Grpc C# (Grpc.Core) (#1721)
* run interop tests against Java instead of Grpc C# (Grpc.Core)

* run interop against C++ to avoid needing to clone another repo
2022-04-29 15:06:45 +02:00
Jan Tattermusch 3ac2881a7a
add Grpc.Auth, Grpc.Core.Api, Grpc.HealthCheck and Grpc.Reflection to build_nuget.sh (#1717) 2022-04-29 15:06:28 +02:00
Jan Tattermusch c46859372f
Move Grpc.HealthCheck and Grpc.Reflection from grpc/grpc (#1708)
* add Grpc.HealthCheck, Grpc.Reflection subtrees (and corresponding tests) at fb4b6c7776a961d0106bb46a6d2ab8832dd87c0c

* initial Grpc.HealthCheck adjustments

* make analyzer for Grpc.HealthCheck happy

* get rid of the Grpc.HealthCheck GRPC_SUPPORT_WATCH ifdef

* add Grpc.HealthCheck readme

* add a TODO

* make Grpc.Reflection buildable

* add Grpc.Reflection README.md

* progress to make Grpc.HealthCheck.Tests work

* progress to make Grpc.Reflection.Tests work

* projectreference to Grpc.HealthCheck and Grpc.Reflection

* add Grpc.HealthCheck and Grpc.Reflection to the solution

* add Grpc.HeathCheck.Tests and Grpc.Reflection.Tests to the solution

* make Grpc.HealthCheck.Tests and Grpc.Reflection.Tests temporarily depend on Grpc.Core nuget
2022-04-29 10:13:10 +02:00
Jan Tattermusch 38845e5523
Move Grpc.Auth nuget from grpc/grpc (#1652)
* add Grpc.Auth tree at 730599bd5b68f12436907cd96ab3fb20579734e7

730599bd5b/src/csharp/Grpc.Auth

* Grpc.Auth adjustments

* fix nullability warning

* add a TODO

* Grpc.Auth.csproj cleanup

* update references to Grpc.Auth to ProjectReference

* add Grpc.Auth.csproj to the solution

* fix doc comment format

Co-authored-by: James Newton-King <james@newtonking.com>

* remove unnecessary .gitignore

Co-authored-by: James Newton-King <james@newtonking.com>
2022-04-29 09:37:30 +02:00
Jan Tattermusch 819dea5af6
Move Grpc.Core.Api nuget from grpc/grpc (#1651)
* add Grpc.Core.Api tree (at SHA dd14f803c3beb433c41be91672c6a7a6eeb8727c)

dd14f803c3/src/csharp/Grpc.Core.Api

* initial adjustments to make Grpc.Core.Api buildable

* fix analyzer warnings in Grpc.Core.Api

* net462 fixup

* bin obj already in gitignore

* add TODOs

* add Grpc.Core.Api to the solution

* pack README.md

* start using net45 again

* add Grpc.Core.Tests tree at e9ece8f7469e667d5202be134bd88980630dba95

e9ece8f746/src/csharp/Grpc.Core.Tests

* remove gitignore

* initial adjustments

* more project adjustments

* remove Grpc.Core specific tests

* Grpc.Core.Api: make internals visible to Grpc.Core.Api.Tests

* remove ChannelOptionsTest (only relevant to Grpc.Core

* CallOptions.Normalize is only implemented in Grpc.Core

* CallCredential.ToNativeCredentials extension method only exists in Grpc.Core

* CallOptionsTest: add TODO

* ChannelCredentials.ToNativeCredentials() only exists in Grpc.Core

* add Grpc.Core.Api.Tests to the solution

* cleanup Grpc.Core.Api.Tests.csproj

* fix versions in VersionInfo.cs

* Version.cs no longer needed (same attributes set elsewhere

* add VersionInfoTest to make sure VersionInfo.cs stays up to date

* cleanup Grpc.Core.Api.csproj

* remove net45-compatibility code

* switch Grpc.Core.Api to net462

* use ProjectReference for Grpc.Core.Api

* add script for updating VersionInfo.cs

* update VersionInfo.cs
2022-04-28 10:22:46 +02:00
Jan Tattermusch 7d2c3c169a
Update version to 2.47.0-dev (on master branch) (#1716) 2022-04-28 10:08:53 +02:00
James Newton-King 7d013e0121
Add call credential methods to client factory and flag to always use call credentials (#1705)
* Add auth interceptor helpers to client factory and flag to always use

* Clean up

* Clean up

* Refactor to use context

* Clean up
2022-04-28 09:48:45 +02:00
James Newton-King a2c907f69d
Fix race when using shared config (#1714) 2022-04-28 09:38:18 +02:00
James Newton-King 24245fd677
Create microsoft-support.md (#1316) 2022-04-28 08:52:04 +08:00
James Newton-King 5982753253
Fix benchmarks defaulting call count to zero (#1711) 2022-04-27 19:08:45 +08:00
James Newton-King 770947bd25
Upgrade System.Commandline and add command line tests (#1700) 2022-04-23 22:16:22 +08:00
Sébastien Ros c9b8aa7dec
Update server address variable for new profiles (#1701) 2022-04-22 05:30:59 +08:00
James Newton-King af4a858335
Place XML comment hrefs in see elements (#1696) 2022-04-20 06:07:08 +08:00
tal66 713935fbf7
Add downloader example (#1695) 2022-04-18 22:13:21 +08:00
James Newton-King d2cc71676a
Add resolver retry to PollingResolver (#1685) 2022-04-18 11:31:23 +08:00
James Newton-King 0ebfff1e83
Update Directory.Build.targets (#1692) 2022-04-18 11:31:09 +08:00
James Newton-King db0dafc78a
Fix call cancellation impacting other calls (#1688) 2022-04-18 11:21:51 +08:00
Wade Pickett 2bb25cab6c
Update README.md: small edit to indicate .NET 3.0 or later. (#1693) 2022-04-18 10:28:36 +08:00
James Newton-King 197b43bbf7
Update MAINTAINERS.md (#1674) 2022-04-14 11:05:28 +02:00
James Newton-King d02f71a759
Fix up nullable annotations for additionalImportDirs (#1673) 2022-04-11 07:34:33 +08:00
James Newton-King 70dd439625
Fix flaky load balancer test (#1677) 2022-04-11 07:31:57 +08:00
Jan Tattermusch 4728d65414
Update version to 2.46.0-dev on master (#1676) 2022-04-07 09:15:45 +02:00
Jan Tattermusch d45c350307
Update Grpc.Core dependency to 2.45.0 (#1659) 2022-04-06 17:16:56 +02:00
Bruno Martins 737f712afe
Issue #1665: added null validation (#1666)
Co-authored-by: James Newton-King <james@newtonking.com>
2022-04-06 08:35:18 +08:00
James Newton-King bfe312a3ba
Support WriteAsync cancellation token (#1645) 2022-04-06 08:20:35 +08:00
James Newton-King 295165518d
Reconnect backoff configuration (#1668) 2022-04-06 08:09:37 +08:00
James Newton-King 87680d504a
Fix unobserved exception from failed calls (#1660) 2022-04-06 07:57:13 +08:00
James Newton-King bbbfdc0f02
Fix calls throw TaskCanceledException after previous call is canceled (#1664) 2022-04-06 07:35:12 +08:00
dependabot[bot] 9f83f9b5ef
Bump minimist from 1.2.5 to 1.2.6 in /testassets/InteropTestsGrpcWebWebsite/Tests (#1662)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-02 09:04:01 +08:00
dependabot[bot] 6d3e6af1e1
Bump minimist from 1.2.5 to 1.2.6 in /examples/Spar/Server/ClientApp (#1658)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-04-02 09:03:36 +08:00
James Newton-King f238855fcb
Update Grpc.Core.Api to 2.45.0-pre1 and remove nullable todos (#1644) 2022-03-23 12:36:45 +08:00
James Newton-King d0272085d9
Update examples to use 2.44.0 (#1636) 2022-03-18 15:31:29 +08:00
James Newton-King ea5f673c10
Add port to subdirectory handler and remove old references (#1635) 2022-03-17 18:19:00 +08:00
dependabot[bot] 1cc747cfbf
Bump lodash from 4.17.15 to 4.17.21 in /examples/Browser/Server/wwwroot (#1639)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-03-16 17:14:58 +08:00
James Newton-King 0551d6aa2e
Add gRPC benchmark QpsWorker (#1617) 2022-03-16 13:34:51 +08:00
James Newton-King b401c2c7e3
Log HTTP method when adding endpoint (#1637) 2022-03-16 09:20:42 +08:00
Jan Tattermusch 05c25a3c5e
Update version to v2.45.0-dev (on master branch) (#1633) 2022-03-09 12:15:50 +01:00
Jan Tattermusch 502648751e
Update Grpc dependency to 2.44.0 (#1631)
* Update Grpc dependency to 2.44.0

* update protobuf version to 3.19.2
2022-03-09 06:32:51 +01:00
James Newton-King d4ee8babcd
Final load balancing review feedback (#1626) 2022-03-02 14:54:33 +08:00
James Newton-King b001e02756
Add ISubchannelCallTracker (#1621) 2022-03-01 10:26:33 +08:00
James Newton-King 41b8e2e76a
Log DebugException from RpcException if present (#1625) 2022-03-01 09:19:53 +08:00
James Newton-King f47ac6bfb8
Update interceptors example to use new GetValue method (#1624) 2022-03-01 09:19:10 +08:00
James Newton-King f01df42b02
Update interop tests to use modern package lock file (#1615) 2022-02-22 19:33:11 +13:00
James Newton-King 7057da7ae7
Narrow GrpcWebMiddleware rules to only rewrite POST requests (#1618) 2022-02-22 17:01:36 +13:00
James Newton-King 15d027bc93
Update spar example app to use modern package lock file (#1614) 2022-02-22 15:17:36 +13:00
James Newton-King 5c206d0e9f
Fix formatting (#1601) 2022-02-17 14:27:24 +13:00
dependabot[bot] b3e8ba64ee
Bump follow-redirects in /testassets/InteropTestsGrpcWebWebsite/Tests (#1612)
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.5 to 1.14.8.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.5...v1.14.8)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-15 17:46:43 +13:00
dependabot[bot] 85b92220ec
Bump ajv from 6.10.2 to 6.12.6 in /examples/Browser/Server/wwwroot (#1611)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-15 14:53:01 +13:00
dependabot[bot] 5641257032
Bump ajv from 6.12.2 to 6.12.6 in /examples/Spar/Server/ClientApp (#1610)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-15 14:52:29 +13:00
dependabot[bot] a007d43bc7
Bump y18n from 3.2.1 to 3.2.2 in /examples/Browser/Server/wwwroot (#1606)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-11 09:05:36 +13:00
dependabot[bot] bdcd0eaf12
Bump tar from 4.4.13 to 4.4.19 in /examples/Browser/Server/wwwroot (#1605)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-02-11 09:04:47 +13:00
James Newton-King 11d7151e7f
Increase deadline precision offset (#1604) 2022-02-11 08:55:04 +13:00
James Newton-King fa546befa2
NuGet readme clean up and fixes (#1602) 2022-02-11 07:57:33 +13:00
James Newton-King 21a1412b87
Remove unused HasBufferedMessage property (#1600) 2022-02-08 15:46:42 +13:00
James Newton-King aed01fe9f4
Fix multiple context propagation configs (#1596) 2022-02-04 15:49:20 +13:00
Ernest Nguyen 137e377efb
Complete Interceptor example (#1598)
Co-authored-by: James Newton-King <james@newtonking.com>
2022-02-03 13:07:11 +13:00
James Newton-King 306abc2979
Update samples to use v2.43-pre1 (#1594) 2022-02-01 16:32:37 +13:00
James Newton-King 915b15de18
Improve EnableCallContextPropagation docs (#1591) 2022-02-01 16:28:32 +13:00
Jan Tattermusch 1d60a7c02d
Update version to 2.44.0-dev (#1593) 2022-01-28 20:29:05 +01:00
James Newton-King 282fa2af8f
Remove Subchannel.State and track state inside load balancer (#1590) 2022-01-28 09:55:22 +13:00
dependabot[bot] 82f89083ed
Bump color-string from 1.5.3 to 1.9.0 in /examples/Spar/Server/ClientApp (#1588)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-26 13:14:32 +13:00
dependabot[bot] 3a355c21c7
Bump ws from 5.2.2 to 5.2.3 in /examples/Spar/Server/ClientApp (#1587)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-26 13:14:19 +13:00
dependabot[bot] 1d18ed324b
Bump path-parse from 1.0.6 to 1.0.7 in /examples/Spar/Server/ClientApp (#1586)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2022-01-26 10:09:08 +13:00
James Newton-King 7b95a53cf2
Add readonly to record structs (#1584) 2022-01-26 09:57:12 +13:00
James Newton-King 3add750544
Add failure microbenchmark (#1581) 2022-01-22 07:37:13 +13:00
James Newton-King a08e7372ff
Fix running HTTP/3 on benchmark environment (#1580) 2022-01-22 07:36:21 +13:00
James Newton-King da6dcc5ca2
Fix running microbenchmarks on .NET 6 (#1579) 2022-01-22 07:35:58 +13:00
Jan Tattermusch 6cc34ee5e7
Update Grpc dependency to 2.43.0 (#1576)
Co-authored-by: James Newton-King <james@newtonking.com>
2022-01-21 07:06:58 +13:00
Jan Tattermusch 257da89bf1
Update version to 2.43.0-dev on master branch (#1575) 2022-01-20 09:27:55 +01:00
James Newton-King ea7a00e7e2
Lower client error logging level (#1577) 2022-01-20 10:01:32 +13:00
James Newton-King 687fbb44a0
Split AsyncResolver out of Resolver (#1573) 2022-01-19 21:49:55 +13:00
James Newton-King 1215046255
Add embedded readme to most used NuGet packages (#1570) 2022-01-19 10:36:42 +13:00
James Newton-King 6d4892c487
Add health checks service mapping configuration (#1565) 2022-01-19 10:36:02 +13:00
James Newton-King 2ff1f4ef8e
Subchannel sockets transport cleanup and tests (#1562) 2022-01-15 21:52:10 +13:00
彭伟 eb813a798a
Fix different activitiy types sent to diagnostic source (#1559)
Co-authored-by: James Newton-King <james@newtonking.com>
2022-01-14 08:52:01 +13:00
James Newton-King 518a6362ba
Fix load balancing subchannel compare and dispose error (#1554) 2022-01-11 15:25:36 +13:00
James Newton-King a04684ab23
Add client testing to Tester example (#1551) 2022-01-05 08:21:53 +13:00
James Newton-King a23602367d
Fix race between deadline and Stream.ReadAsync (#1550) 2022-01-04 11:10:29 +13:00
James Newton-King 1ac3a3f3be
Use IHttpActivityFeature to get host activity (#1545)
Co-authored-by: Safia Abdalla <safia@safia.rocks>
2022-01-04 08:59:36 +13:00
James Newton-King 9c936f3ca5
Add deflate compression to .NET 6 (#1548) 2022-01-04 08:42:53 +13:00
James Newton-King 6acecf4ad4
Fix client with custom ConnectCallback (#1542) 2021-12-29 09:21:39 +13:00
Jan Tattermusch 3ebcc938a9
Update Grpc.Core.Api dependency to 2.42.0 (#1539)
Co-authored-by: James Newton-King <james@newtonking.com>
2021-12-29 09:15:31 +13:00
James Newton-King 8fa8389812
Add uploader sample (#1529) 2021-12-22 16:48:33 +13:00
James Newton-King bce585246d
Code clean up across solution (#1530) 2021-12-22 15:52:54 +13:00
James Newton-King 7d081d7c26
Add accept header to grpc-web-text requests (#1522) 2021-12-16 11:27:23 +13:00
James Newton-King 520c57415e
Change Resolver.ResolveAsync to virtual (#1523) 2021-12-16 11:27:09 +13:00
James Newton-King d5626ab20b
Publish Grpc.AspNetCore.HealthChecks package (#1509) 2021-12-02 16:03:48 +13:00
James Newton-King d2035de5f6
Change InteropTestClient to net5.0 (#1514) 2021-12-01 13:09:53 +13:00
James Newton-King fb42fc0c8a
Add diagnostic listener to interop client (#1513) 2021-12-01 10:24:38 +13:00
James Newton-King 16a1bb4ca4
Log BalancerAddress instead of DnsEndPoint in load balancing (#1504) 2021-12-01 09:41:21 +13:00
James Newton-King 78bf205a90
Update examples to .NET 6 (#1507) 2021-12-01 09:33:15 +13:00
James Newton-King 747088e5b8
Update JS test packages (#1505) 2021-12-01 09:21:58 +13:00
James Newton-King b9cb8806ae
Update all solution projects to .NET 6 (#1503)
Co-authored-by: Safia Abdalla <safia@safia.rocks>
2021-11-24 20:41:18 +13:00
James Newton-King 0d5a300154
Add interceptor with GetStatus tests (#1502) 2021-11-24 20:11:36 +13:00
James Newton-King 868adfe377
Various fixes recommended by analysis (#1498) 2021-11-22 13:14:51 +13:00
James Newton-King f5e4ad7384
Add .NET 7 package source to fix benchmarks (#1496) 2021-11-22 13:08:55 +13:00
James Newton-King 7ef184f3c4
Enable implicit namespaces and clean up usings (#1497) 2021-11-22 13:05:14 +13:00
Maksim Ivanyuk 5d447fdc8e
set backslash as path separator for Protobuf item (#1323)
* set backslash as path separator for Protobuf item

* add tests

* remove unused method
2021-11-16 17:17:59 -08:00
James Newton-King dce1ef72d8
DNS resolver fix port usage (#1493)
Co-authored-by: Vuk Vasić <hasterson123@gmail.com>
2021-11-17 06:13:39 +13:00
James Newton-King 202985251b
Refactor client load balancing resolver (#1491) 2021-11-16 21:20:53 +13:00
James Newton-King e48a0364d5
Resolver has separate error for fetching service config (#1475) 2021-11-16 20:50:33 +13:00
James Newton-King 00f7601709
Add unit test for client factory and HTTP/3 (#1487) 2021-11-16 20:16:24 +13:00
James Newton-King 763d3b99a3
Unit test least used balancer (#1473) 2021-11-12 12:58:25 +13:00
Jan Tattermusch a7c6c47bc4
Update Grpc.Core.Api dependency to 2.41.0 (on master branch) (#1484) 2021-11-12 06:42:33 +13:00
Jan Tattermusch b1e7b44387
Sanity check for user agent string length not useful (#1485) 2021-11-12 06:40:05 +13:00
Jan Tattermusch b04688b437
Update version to 2.42.0-dev (on master branch) (#1480) 2021-11-11 10:31:39 +01:00
James Newton-King 530eb1c25c
Add support for per-address attributes (#1472) 2021-11-09 12:00:27 +13:00
James Newton-King 82dec0ff51
Fix server trim error from dependency injection (#1471) 2021-11-08 21:07:43 +13:00
James Newton-King a9b0064a66
Fix trim warnings (#1465) 2021-11-05 15:47:08 +13:00
James Newton-King d5682d4823
Update retrier sample (#1464) 2021-11-04 10:19:46 +13:00
James Newton-King afe2100cda
Update example README.md with container example (#1437) 2021-10-12 14:28:11 +13:00
James Newton-King c85ca5c432
Reset HTTP/3 request on deadline exceeded (#1446) 2021-10-12 14:27:16 +13:00
James Newton-King 48eb2e9074
Ensure That Timer Callback Does not Call Method on Disposed Timer (#1445)
Co-authored-by: thefringeninja <495495+thefringeninja@users.noreply.github.com>
2021-10-12 08:08:55 +13:00
Safia Abdalla f777808fa1
Address followups in UserAgentGenerator code (#1423)
* Address followups in UserAgentGenerator code

* Address more feedback from review

* Fix typo in method name
2021-10-07 20:45:35 -07:00
James Newton-King cb2f9d7826
Fix race by throwing response error after completing call (#1443) 2021-10-08 10:30:49 +13:00
James Newton-King 17b2beb9b7
Refactor client factory channel and interceptor lifetime (#1430) 2021-10-06 14:34:50 +13:00
James Newton-King b63993f40d
Add detail to server RPC error log message and remove exception (#1436) 2021-10-05 16:43:28 +13:00
James Newton-King 056e386ad9
Enable preview features for HTTP/3 (#1438) 2021-10-05 16:42:59 +13:00
James Newton-King c1d3bbfccd
Update Google.Protobuf to 3.18.0 (#1432) 2021-10-05 09:35:01 +13:00
James Newton-King ac3b3f4309
Fix race between CompleteAsync and call dispose (#1429) 2021-10-01 07:21:21 +13:00
James Newton-King 3469513fe7
Fix hardcoded SDK in get-dotnet.sh (#1427) 2021-09-29 09:53:11 +13:00
Safia Abdalla 5f762ae977
Update check for secure channel in ReadCredentials (#1428)
* Update check for secure channel in ReadCredentials

* Apply suggestions from code review

* Update test/FunctionalTests/Balancer/ConnectionTests.cs

Co-authored-by: James Newton-King <james@newtonking.com>

Co-authored-by: James Newton-King <james@newtonking.com>
2021-09-28 13:30:18 -07:00
James Newton-King 8666a11362
Fix streaming with no response messages not successful (#1401) 2021-09-28 11:51:33 +13:00
James Newton-King 0f26bd7b2f
Client handle server cancellation for deadline (#1402) 2021-09-27 16:43:55 +13:00
James Newton-King 7c35727de4
Fix deadline counter not being incremented if server returns first (#1399) 2021-09-24 18:20:48 +12:00
James Newton-King a01ea842a7
Fix combining auth and retry (#1414) 2021-09-22 15:00:18 +12:00
Safia Abdalla bb9284fb62
Add more info to UserAgent header (#1411)
* Add more info to UserAgent header

* Address feedback from peer review

* Some cleanups
2021-09-17 12:30:50 -07:00
James Newton-King 094532f0fb
Fix flakey test timeouts (#1390)
* Fix flakey test timeouts

* Clean up

* Deflake test

* More clean up

* Fix

* Update test/FunctionalTests/Web/Server/DeadlineTests.cs

* Apply suggestions from code review

Co-authored-by: Safia Abdalla <safia@safia.rocks>
2021-09-09 11:52:53 +02:00
Jan Tattermusch 7be660d629
Bump version to 2.41.0-dev (on master branch) (#1405)
* bump version to 2.41.0-dev

* update Grpc.Core.Api dependency to 2.40.0
2021-09-09 11:39:02 +02:00
James Newton-King c804021ac3
Fix gRPC retry calls not unregistering from cancellation token (#1398) 2021-09-04 09:28:53 +12:00
James Newton-King 15158af86d
Fix client timeout when error in custom CallCredential (#1388) 2021-08-24 07:52:27 +12:00
James Newton-King 95ea1dcb1b
Fix error from tests HttpEventSourceListener (#1387) 2021-08-23 20:56:30 +12:00
James Newton-King e3a2c06639
Default HTTP version to 1.1 when using gRPC-Web on netfx (#1377) 2021-08-20 10:21:05 +12:00
James Newton-King 36df3c2e31
Update containers sample to use .NET 6 SDK image (#1379) 2021-08-20 10:20:44 +12:00
James Newton-King a6eccf0dc3
Make load balancing log IDs unique (#1376) 2021-08-20 10:01:33 +12:00
James Newton-King 11f0958d12
Additional functional test logging for .NET 6 (#1382) 2021-08-20 09:59:54 +12:00
James Newton-King 1cd34bd832
Update MAINTAINERS.md (#1383) 2021-08-19 10:58:29 +02:00
James Newton-King f77622b3bd
Update benchmark to use generated cert instead of default cert (#1385) 2021-08-19 08:57:40 +12:00
James Newton-King f552a4982f
Fix flakey load balancing fallback tests (#1370) 2021-08-15 17:17:29 +12:00
apolcyn d585f36132
Merge pull request #1355 from apolcyn/b
Bump GrpcPackageVersion to 2.39.1
2021-08-14 10:56:50 -07:00
Alexander Polcyn 420ca57ac2 bump GrpcPackageVersion to 2.39.0-pre1 2021-08-13 12:19:39 -07:00
James Newton-King e920c52048
Update SDK and targets to .NET 6 (#1359) 2021-08-10 22:16:17 +12:00
James Newton-King 8db4604542
Fix using gRPC reflection with services that have a base type (#1352) 2021-07-30 09:51:28 +12:00
Paul 8b30ef9c7a
fix typo in README.md link (#1354) 2021-07-30 09:48:05 +12:00
James Newton-King a1389a0811
Fix error when HedgingDelay is null (#1351) 2021-07-27 21:57:51 +12:00
James Newton-King bf26e0377a
Add client streaming interceptor test (#1337) 2021-07-16 13:44:33 +12:00
James Newton-King 6920e2abd0
gRPC client-side load balancing (#1286) 2021-07-05 18:50:44 +12:00
James Newton-King f54a118569
Fix not using invariant culture with duration text (#1327) 2021-06-16 09:25:38 +12:00
Kia Panahi Rad 5bb5f48fc4
Improvements in Ticketer example (#1315) 2021-06-03 13:38:51 +12:00
John Luo 31009f6de1
Fix refresh argument arity (#1313) 2021-06-03 10:05:57 +12:00
Kia Panahi Rad 5d223d540e
Minor improvements in examples codebase: Mailer (#1312)
Co-authored-by: James Newton-King <james@newtonking.com>
2021-06-02 15:51:56 +12:00
Sébastien Ros e0b839290f
Migrate to Crank.EventSources package (#1297)
Co-authored-by: James Newton-King <james@newtonking.com>
2021-05-14 09:53:19 +12:00
James Newton-King 560e141e68
Add retrier example app (#1284) 2021-05-07 12:09:47 +12:00
Jan Tattermusch 4c410dcc39
Update docs on the recommended C# implementation (#1278)
* update README.md

* update implementation_comparison.md

* Update README.md

Co-authored-by: James Newton-King <james@newtonking.com>

Co-authored-by: James Newton-King <james@newtonking.com>
2021-05-03 13:49:42 +02:00
Jan Tattermusch 650aaa110f
Update implementation_comparison.md (#1270) 2021-04-26 13:35:33 +02:00
Jan Tattermusch 2ab0587190
Update version to v2.38.0-dev (on master branch) (#1272) 2021-04-20 06:48:39 +02:00
Jan Tattermusch 9f72e70c6a
Prepare master branch for 2.37.x release (#1268) 2021-04-14 14:03:49 +02:00
James Newton-King ebf7bbd9b2
Update WinHttpHandler to version available on NuGet (#1266) 2021-04-14 21:30:48 +12:00
James Newton-King bb14b9b2ea
Update .NET SDK version (#1263) 2021-04-14 18:27:16 +12:00
James Newton-King 85883a2d4b
Record benchmark request errors as requests (#1260) 2021-04-08 12:03:00 +12:00
James Newton-King 2844af7c2c
Update benchmark apps to use optimized way to create ByteString (#1261) 2021-04-08 11:58:59 +12:00
James Newton-King 7f341664d6
Update exception and documentation links to be human readable (#1259) 2021-04-08 11:56:40 +12:00
James Newton-King 78306e4723
Add validation of the channel address (#1258) 2021-04-06 13:40:40 +12:00
James Newton-King 57a7ad5339
Throw an error when ConfigureHttpClient is used with gRPC (#1257) 2021-04-02 11:08:11 +13:00
James Newton-King 7e3f2c3115
Move static Log classes out of generic types (#1253) 2021-04-01 17:28:20 +13:00
James Newton-King 6fd69504c7
Add netstandard2.0 to Grpc.Net.ClientFactory (#1248) 2021-03-20 11:47:25 +13:00
Jan Tattermusch 4f61419d80
Update version to 2.37.0-dev on the master branch (#1243) 2021-03-18 06:48:31 +01:00
James Newton-King 45ab5036e7
Add Frameworker example (#1234) 2021-03-18 08:57:07 +13:00
James Newton-King b93d87eff1
Fix streaming flaky tests (#1235) 2021-03-17 07:05:07 +13:00
James Newton-King b95400a20f
Fix client hang when call has missing or invalid trailers (#1232) 2021-03-11 13:27:16 +13:00
James Newton-King ab79d7fc40
Minor XML docs improvement (#1230) 2021-03-11 13:26:19 +13:00
James Newton-King b8a2408f18
Report docker build failures from gRPC-Web tests (#1227) 2021-03-10 09:30:56 +13:00
Jan Tattermusch 250331e390
Prepare for v2.36.x branch cut. (#1228)
* Update dependencies.props

* Update version.props
2021-03-09 19:15:08 +01:00
James Newton-King 761bfe8f71
Update many NuGet packages to latest verions (#1221) 2021-03-09 13:30:49 +13:00
James Newton-King be36d78d79
Add comment about WinHttp to client (#1225) 2021-03-09 11:50:18 +13:00
James Newton-King 4b4a7bd2b5
Update error message when no HttpHandler configured (#1220) 2021-03-09 11:19:34 +13:00
James Newton-King 37653639d6
gRPC client retries (#1187) 2021-03-09 11:18:26 +13:00
James Newton-King 978200abd5
Fix client not raising HTTP diagnostic source events (#1211) 2021-03-03 10:39:30 +13:00
James Newton-King 5c7cf6cf33
Update context propagation to use call static delegates (#1216) 2021-03-01 10:28:36 +13:00
hanabi1224 37660f5de4
update sample spar to use latest protobuf and grpc-web (#1212) 2021-02-28 21:32:30 +13:00
James Newton-King a72397cebb
Remove DiagnosticsSource package reference from .NET 5 client (#1207) 2021-02-24 10:24:20 +13:00
James Newton-King 08024e350d
gRPC-Web - Add .NET Standard 2.0 support (#1203) 2021-02-18 10:25:01 +13:00
James Newton-King 3c675bed8f
Fix .NET Standard 2.0 merge (#1204) 2021-02-17 15:24:32 +13:00
James Newton-King 927c0e5d72
Target .NET Framework (#1118) 2021-02-17 10:36:16 +13:00
James Newton-King 538e3720a6
Fix deadline timer rescheduling because of timer precision (#1201) 2021-02-13 12:19:19 +13:00
James Newton-King 9c3385ad84
Fix response stream errors not updating call status (#1198) 2021-02-10 10:59:07 +13:00
James Newton-King 4a8a120317
Change some RequestStream.WriteAsync errors to match Grpc.Core (#1199) 2021-02-10 10:56:07 +13:00
John Luo a3e67446a2
Add clarification on how to run examples (#1185)
* Add clarification on how to run examples

* Update examples/README.md

* Update examples/README.md

* Update examples/README.md

Co-authored-by: James Newton-King <james@newtonking.com>
2021-02-02 14:14:16 -08:00
James Newton-King 822c36fea4
Change gRPC client factory to set HttpHandler (#1183) 2021-02-02 14:29:01 +13:00
Jan Tattermusch 76ae64d3b0
Prepare master branch for 2.35.x release (#1178)
* Prepare master branch for 2.35.x release

* Update Grpc.Core dependency to 2.35.0
2021-01-26 14:05:36 +01:00
John Luo d8d982b291
Roll forward using LatestMajor behaviour (#1167)
* Roll forward using LatestMajor behaviour

Instead of Major behaviour

* Update comment
2021-01-13 08:51:28 -08:00
James Newton-King ec6de5c047
Improve error message when CORS is not configured correctly (#1171) 2021-01-13 08:42:49 +13:00
James Newton-King e34cef6c64
Fix setting user-agent in client when running in the browser (#1165) 2021-01-12 18:17:46 +13:00
James Newton-King 7d6683e3b3
Write grpc-web trailer names to response as lowercase (#1170) 2021-01-12 18:02:53 +13:00
James Newton-King ab2efbaed1
Clean up sources.props (#1169) 2021-01-12 17:41:44 +13:00
James Newton-King df29d5274c
Fix build on benchmark server (#1148) 2020-12-17 11:54:25 +13:00
James Newton-King 291ddf395c
Add code-first sample (#1142) 2020-12-12 10:10:56 +13:00
James Newton-King 543ee70bc8
Add separate gRPC-Web test build job (#1137) 2020-12-04 07:50:09 +13:00
Jan Tattermusch 4da20fba32
Improve github actions workflow (#1136) 2020-12-03 09:06:41 +13:00
James Newton-King bbf8ffe982
Fix running in benchmarks environment with net60 (#1133) 2020-12-03 08:29:09 +13:00
Jan Tattermusch ac2523fc2a
Remove .travis.yaml in favor of github actions (#1135)
* remove .travis.yaml in favor of github actions

* run pull request tests even on release branches
2020-12-02 11:12:59 +01:00
Jan Tattermusch 04b0a1cdb7
Upgrade Grpc.Core packages to 2.34.0-pre1 (#1130) 2020-12-01 10:13:29 +01:00
James Newton-King c637a4e9f1
Improve streaming error messages when call is complete (#1121) 2020-12-01 13:40:44 +13:00
James Newton-King dfd2cb3f96
Improve transporter sample error (#1127) 2020-12-01 11:12:15 +13:00
James Newton-King 850f455753
Add more gRPC-Web authentication tests (#1119) 2020-12-01 11:11:11 +13:00
James Newton-King cd2e76860c
Update Blazor sample to use navigation manager by default (#1129) 2020-12-01 11:10:20 +13:00
James Newton-King a435b71956
Update gRPC and Protobuf package versions (#1117) 2020-11-17 14:27:31 +13:00
James Newton-King 123ae72fb5
Fix GrpcWebHandler with TLS+HTTP/1.1 endpoints in .NET 5 (#1111) 2020-11-16 18:22:14 +13:00
James Newton-King dd4dca5b7b
Optimize deadline logic (#1102) 2020-11-12 12:09:15 +13:00
James Newton-King e7e779f35f
Update to .NET 5 RTM (#1109) 2020-11-12 10:52:21 +13:00
James Newton-King 922b8dfd39
Update Microservicer sample to net5.0 (#1079) 2020-11-07 19:59:16 +13:00
James Newton-King 13a4bf1b2d
Clean up RpcException logic in client (#1099) 2020-11-04 10:02:12 +13:00
James Newton-King c48ae4442f
Change exceptions to be more consistent with Grpc.Core (#1092) 2020-11-02 09:13:49 +13:00
James Newton-King bf3b057e32
Fix flaky max concurrent streams test (#1088) 2020-10-27 10:58:19 +13:00
Jan Tattermusch 3807a8cb58
Bump version to 2.34.0-dev (on master branch) (#1087) 2020-10-22 11:37:14 +02:00
Jan Tattermusch e37e2f13a1
Update Grpc.Core.Api dependency to 2.33.1 (#1085) 2020-10-22 10:46:54 +02:00
James Newton-King 874cb5535e
Fix flakiness when calling GetStatus after error (#1083) 2020-10-22 20:32:15 +13:00
James Newton-King e36e1218e9
Fix race condition between deadline and call finishing (#1082) 2020-10-22 09:42:59 +13:00
James Newton-King 96c06f45e7
Support aggressive trimming (#1060) 2020-10-21 14:31:20 +13:00
James Newton-King be778112dc
Support netcoreapp3.1 in benchmark apps and call count limit (#1078) 2020-10-20 11:54:13 +13:00
James Newton-King 4827aea48d
Remove TestServer workaround handler (#1069) 2020-10-14 13:04:12 +13:00
James Newton-King 00d6a0b4a8
Fix potential torn reads by counters (#1073) 2020-10-14 12:47:49 +13:00
James Newton-King 27257a7c3b
Update 2.32.0 dependency (#1068) 2020-10-06 13:02:04 +13:00
James Newton-King 3518cd7570
Remove old benchmarks project (#1066) 2020-10-01 11:27:00 +13:00
James Newton-King a2918b07a2
Client response MoveNext cancellation cancels call (#1062) 2020-09-25 07:57:31 +12:00
James Newton-King 5395000b37
Avoid calling async local Activity.Current multiple times (#1059) 2020-09-25 07:56:58 +12:00
James Newton-King 86f4600121
Client response MoveNext cancellation cancels call 2020-09-24 21:24:10 +12:00
James Newton-King f418e5d5f7
Update example projects to net5.0 (#1058) 2020-09-22 14:19:24 +12:00
James Newton-King 11a7146c9e
Update to RC2 and re-add transporter example (#1056) 2020-09-17 09:04:50 +12:00
James Newton-King 637afdbec6
Don't include server header in benchmarks for real this time (#1055) 2020-09-16 08:40:55 +12:00
James Newton-King 59062ec54d
Extra metadata filtering in client and server (#1052) 2020-09-15 12:14:27 +12:00
James Newton-King 7fe4595de9
Skip server header in benchmark website (#1050) 2020-09-12 10:27:37 +12:00
James Newton-King 139040e840
Fix client to only filter known gRPC headers (#1046) 2020-09-12 09:56:57 +12:00
James Newton-King 0a37300796
Don't write response grpc-encoding header when identity (#1047) 2020-09-12 09:35:04 +12:00
James Newton-King 84f6a3e7d0
Fix repeatedly decoding base64 with large grpc-web-text request (#1045) 2020-09-10 13:43:38 +12:00
apolcyn a76308fd2b
Merge pull request #1039 from apolcyn/bump_version
Bump Grpc.Core dependency to 2.32.0-pre1
2020-09-03 13:55:21 -07:00
Alexander Polcyn 47b7506e1f Bump Grpc.Core dependency to 2.32.0-pre1 2020-09-03 12:25:44 -07:00
James Newton-King 1e82c56974
React to connection abstractions removal. Remove transporter (#1038) 2020-09-03 14:35:22 +12:00
James Newton-King cc7b97f6da
Client factory handler supports multiple HTTP/2 connections (#1037) 2020-09-03 12:27:38 +12:00
James Newton-King b10480cbe0
Client serialization optimizations (#1033) 2020-09-02 15:54:35 +12:00
James Newton-King fdb96193ba
Re-enable gRPC-Web interop tests in CI build (#1034) 2020-09-02 09:40:50 +12:00
James Newton-King a9827e5ccc
Add transporter example (#1025) 2020-08-28 11:40:06 +12:00
James Newton-King 55cde44349
Update Grpc.Core and Google.Protobuf dependencies (#1031) 2020-08-28 09:09:59 +12:00
James Newton-King af709ddf42
Check SocketsHttpHandler.IsSupported before creating handler (#1030) 2020-08-27 10:18:38 +12:00
James Newton-King 5faaabef72
Fix Blazor interop project SDK (#1024) 2020-08-22 08:03:52 +12:00
James Newton-King 4bf32368ee
Decrease log level of server message errors to Information (#1023) 2020-08-21 08:16:37 +12:00
James Newton-King ef77760676
Multi-target .NET 5 (#987) 2020-08-20 23:38:01 +12:00
James Newton-King 6df196c110
Suppress routing auth check in benchmark server (#1014) 2020-08-12 06:41:38 +12:00
James Newton-King 4c92b23cfb
Additional channel tests (#1003) 2020-08-06 09:32:44 +12:00
James Newton-King c42358b2c3
Fix benchmarks app on net5.0 (#1009) 2020-08-04 20:29:59 +12:00
Jan Tattermusch 1b44bef567
Bump Grpc.Core dependency to 2.31.0-pre2 (#1001)
* Bump Grpc.Core dependency to 2.31.0-pre2

* Update dependencies.props

* Fix nullable warnings

* Fix package version

Co-authored-by: John Luo <johluo@microsoft.com>
Co-authored-by: James Newton-King <james@newtonking.com>
2020-08-03 19:28:59 +02:00
James Newton-King 49fc4f1841
Fix benchmark client incorrectly measuring warmup RPS (#1007) 2020-08-03 09:20:48 +12:00
James Newton-King 634fda1fec
Use latest version of OpenTelemetry with gRPC in sample (#973) 2020-08-01 16:35:56 +12:00
James Newton-King 797619b329
Racer example reports progress in realtime (#1000) 2020-07-30 12:35:50 +12:00
James Newton-King aca0a8def5
Add liber example (#992) 2020-07-23 09:00:32 +12:00
James Newton-King 75c5cbb082
Fix failing actions test (#993) 2020-07-21 20:36:22 +12:00
Jan Tattermusch e911dac2e5
Try fix build and test with github actions. (#990)
* Try fix build and test with github actions.

* Update test.yml
2020-07-20 12:52:19 +02:00
Jan Tattermusch 39c2dcd78e
try github actions (#985) 2020-07-20 11:10:37 +02:00
James Newton-King 6b65f9b2ad
Update Grpc.* dependencies to 2.30.0 (#986) 2020-07-17 11:35:52 +12:00
James Newton-King 59ac331075
Update microservicer example readme (#982) 2020-07-16 11:52:00 +12:00
James Newton-King 27cf289089
Add microservice example (#981) 2020-07-16 11:28:12 +12:00
James Newton-King 02883fb00d
Rename variables and args related to client certificate benchmark (#971) 2020-07-09 14:27:15 +12:00
James Newton-King 08a0a558c7
Fix MaxReceiveMessageSize/MaxSendMessageSize null issues (#967) 2020-07-07 18:28:41 +12:00
James Newton-King 9c294e0394
Extra deadline logs, don't write message when deadline exceeded (#961) 2020-06-30 16:06:48 +12:00
James Newton-King b9f862170a
Update extensions dependencies to 3.0.3 (#962) 2020-06-27 09:29:12 +12:00
Jan Tattermusch 7e8b6e85f1
Update version to 2.31.0-dev on master (#957) 2020-06-23 13:06:51 +01:00
James Newton-King 4daaf07a26
Set unexpected errors in Status.DebugException (#947) 2020-06-12 16:08:37 +02:00
James Newton-King e02fd189d1
Update Grpc dependency to 2.30.0-pre1 (#945)
* Update Grpc dependency to 2.30.0-pre1

* Use Metadata helper methods
2020-06-12 09:02:24 +02:00
Andrew Stanton-Nurse ba05ea11b8
Remove @anurse from maintainers (#941) 2020-06-08 18:22:02 -07:00
James Newton-King e1669ed6f2
Remove explicit dotnet versions from GrpcClient (#939) 2020-06-05 11:22:00 +12:00
James Newton-King 8251675415
Add issue config file with link to grpc/grpc (#937) 2020-06-04 09:53:50 +12:00
James Newton-King ff32e56713
Update example projects to 2.29.0 (#929) 2020-06-04 07:23:23 +12:00
James Newton-King 64efb1cd68
Update benchmark app branches to use grpc-dotnet (#935) 2020-06-04 06:41:18 +12:00
hanabi1224 f89cfc2fa9
Upgrade grpc-web npm package to latest (#931) 2020-06-02 16:19:56 +12:00
James Newton-King 283098b2d5
Add gRPC benchmark client (#891) 2020-06-02 16:04:44 +12:00
Varorbc 9b759a54d0
optimize package dependencies (#877) 2020-06-02 15:50:02 +12:00
James Newton-King 241b21df05
Fix Source Link warning and enable CI build in build script (#927) 2020-05-29 12:19:51 +12:00
James Newton-King 1344beb663
Change error status when no message is returned in unary calls (#920) 2020-05-27 11:50:44 +12:00
James Newton-King c2cf53641f
Fix sending and receiving duplicate header names (#918) 2020-05-22 08:03:55 +12:00
James Newton-King 074b17a573
Update samples to use latest grpc-dotnet and Blazor (#914) 2020-05-21 17:28:12 +12:00
James Newton-King 90c0ecc41c
Additional ReadAllAsync tests (#911) 2020-05-19 09:12:32 +12:00
Günther Foidl 32df65a6c3
Fixed AsyncStreamReaderExtensions.ReadAllAsync argument validation (#909) 2020-05-16 11:13:43 +12:00
Jan Tattermusch 5de614014d
Upgrade to Grpc.Core.Api to 2.29 (#906) 2020-05-15 11:28:37 +02:00
James Newton-King 103105e75f
Update dependencies and fix warnings (#899) 2020-05-13 18:40:27 +12:00
James Newton-King 9bc4d27d39
Check for in-progress write in ServerStreamWriter (#903) 2020-05-13 18:24:30 +12:00
James Newton-King 41618a497b
Write unary content with single Stream.WriteAsync (#901) 2020-05-13 09:17:45 +12:00
James Newton-King 90609adec0
Add GrpcChannelOptions.HttpHandler and channel default to invoker (#896) 2020-05-06 12:31:56 +12:00
James Newton-King 1b3588ca21
Update interop client to use System.Commandline (#890) 2020-05-06 08:21:36 +12:00
James Newton-King 97af9b2fa5
Update System.CommandLine package (#889) 2020-05-06 08:10:13 +12:00
James Newton-King 035c791b10
Add test for ResponseStream.MoveNext cancellation (#897) 2020-05-06 06:47:52 +12:00
James Newton-King 38ea7e8441
Build non-preview gRPC-Web packages (#888) 2020-05-05 07:47:11 +12:00
James Newton-King 54add4f70f
Update benchmark apps to use latest framework and include required feed (#887) 2020-04-30 11:17:05 +12:00
James Newton-King 4d7cad8e00
Fix flaky client cancellation tests (#885) 2020-04-30 08:46:16 +12:00
James Newton-King f182c41f1f
Add gRPC-Web Blazor interop tests (#859) 2020-04-29 10:25:08 +12:00
James Newton-King 52165289fe
Add SubdirectoryHandler for injecting a subdirectory into gRPC calls (#882) 2020-04-29 07:48:43 +12:00
James Newton-King cf09aafced
Update Blazor sample to preview 5 (#881) 2020-04-24 10:35:13 +12:00
James Newton-King 1df26fe32d
Fix nullable warnings from latest VS version (#878) 2020-04-24 10:03:16 +12:00
James Newton-King bba2e5d385
Fix race condition when finishing streaming and getting trailers (#876) 2020-04-22 14:48:36 +12:00
James Newton-King f99787e28f
Set property to enable streaming in WASM and gRPC-Web (#872) 2020-04-21 09:24:44 +12:00
James Newton-King 6f452e10b7
Dispose timer from long running deadline (#873) 2020-04-21 09:13:45 +12:00
James Newton-King 1ca4245af8
Merge pull request #851 from JamesNK/mgravell-marc/generalize-client-factory
Support per-client factories and non-ClientBase implementations
2020-04-18 11:17:07 +12:00
James Newton-King 70d9728aa7
Refactor to a creator on factory client options 2020-04-18 11:04:06 +12:00
mgravell 305cb17e2a
proposed changes for generalizing client factory to other implementations (see: protobuf-net.Grpc) 2020-04-18 11:04:03 +12:00
James Newton-King 3ce9b10452
Update exposed CORS headers in tests and samples (#869) 2020-04-17 17:04:53 +12:00
James Newton-King 95159e54c7
Update Blazor sample to preview 4 (#871) 2020-04-17 17:03:27 +12:00
James Newton-King c6b8f6c706
Change global options to be configured with UseGrpcWeb method (#865) 2020-04-16 13:29:06 +12:00
James Newton-King 58b2e1c9b3
Update Blazor sample to latest preview (#852) 2020-04-08 07:10:36 +12:00
James Newton-King cb7c70e2ef
Add streams benchmark definitions (#850) 2020-04-03 11:39:18 +13:00
James Newton-King a5d970b5f2
Add catch to server unary interceptor (#847) 2020-04-03 11:16:22 +13:00
James Newton-King 554ea26113
Fix building Vigor sample in VS (#846) 2020-03-31 10:37:02 +13:00
James Newton-King 262de5b28c
Add compressor example (#840) 2020-03-31 10:16:59 +13:00
James Newton-King afc2b21761
Support custom ServerCallContext types with GetHttpContext (#841) 2020-03-30 18:53:03 +13:00
James Newton-King fced036711
Merge pull request #835 from JamesNK/jamesnk/spar-example
Add CORS example
2020-03-28 15:59:02 +13:00
James Newton-King dfb34ae672
Update readme and spar sample to be consistent with other sample 2020-03-28 15:48:02 +13:00
hanabi1224 2c2b8adf43
Add CORS example 2020-03-28 15:48:02 +13:00
James Newton-King 04bbe4fc59
Improve GetHttpContext (#838) 2020-03-28 15:47:17 +13:00
James Newton-King 57fa08534b
Fix flaky DuplexStream_SendToUnimplementedMethod_ThrowError (#839) 2020-03-28 15:34:28 +13:00
James Newton-King 03778703f3
Update browser sample to not require HTTP/2 (#834) 2020-03-28 10:16:58 +13:00
James Newton-King 95c99074b0
Support multiple streams per connection in benchmark client (#831) 2020-03-25 00:08:22 +13:00
James Newton-King 799a8a1f66
Improve logging interceptor sample (#827) 2020-03-24 10:28:34 +13:00
Jiangtao Li 5dd0eef830
Sync and up test credentials from grpc main repo (#826) 2020-03-23 15:47:42 +01:00
James Newton-King 5c6080a204
Fix ServerCallContext.Peer with IPv6 (#824) 2020-03-19 08:53:39 +13:00
James Newton-King adf4deb6ed
Change GrpcWebHandler version to a property (#822) 2020-03-19 08:04:19 +13:00
James Newton-King 3a9b23de55
Reduce logging noise at startup from gRPC service discovery (#819) 2020-03-17 10:13:07 +13:00
James Newton-King b26695aceb
Fix gRPC-web auth flaky test (#821) 2020-03-17 10:07:18 +13:00
James Newton-King a656d7abb6
Client factory integration option to ignore context not found (#814) 2020-03-16 22:13:14 +13:00
James Newton-King cc00b55b06
Change server streaming benchmark to reuse response (#815) 2020-03-12 08:08:46 +13:00
James Newton-King 0b5320af97
Fix GrpcWebHandler not always resetting HTTP version back to 2.0 (#809) 2020-03-07 10:11:23 +13:00
James Newton-King 663b228bdb
Remove service related allocations in benchmark (#808) 2020-03-06 13:49:37 +13:00
James Newton-King 76abb53787
Remove task allocation in unary call handler (#807) 2020-03-06 13:33:35 +13:00
John Luo 4864460865
Include inner exception messages in RpcException status detail (#804)
* Include inner exception messages in RpcException status detail.

* Clean up

* PR feedback

* Clean up
2020-03-04 21:38:37 -08:00
Jan Tattermusch 24b6b0c2ad
Update Grpc.Core and protobuf dependencies (#796) 2020-03-02 13:53:53 -08:00
James Newton-King f98933ce04
Fix to ignore unknown methods (#791) 2020-02-27 09:25:01 +13:00
James Newton-King af93d32591
Add option to ignore calls to unknown gRPC services (#788) 2020-02-26 10:19:48 +13:00
James Newton-King 1159126138
Avoid CancellationToken related allocations (#787) 2020-02-25 10:03:16 +13:00
James Newton-King 2cb89bf446
Optimize client buffers during serialization (#775) 2020-02-20 21:23:38 +13:00
James Newton-King 3ec2aa8c60
Test functional tests with TestServer (#668) 2020-02-20 20:56:22 +13:00
James Newton-King db7d128f59
Complete activity and log before returning result in client (#779) 2020-02-20 15:14:56 +13:00
James Newton-King 344c4adc93
Fix error when not reseting HTTP version in gRPC-Web (#774) 2020-02-19 08:50:56 +13:00
James Newton-King 9390e16e8d
Change non-OK status client log message from error to info (#777) 2020-02-19 07:59:57 +13:00
Abhishek Kumar d1b2b6496b
Merge pull request #769 from anurse/patch-1
Add myself to maintainers list
2020-02-13 10:12:52 -08:00
Andrew Stanton-Nurse e032d5046c
Add myself to maintainers list 2020-02-12 14:33:33 -08:00
James Newton-King 41f591d235
Fix sending large grpc-web-text requests (#766) 2020-02-13 11:21:26 +13:00
James Newton-King 7c01479a07
Remove Grpc.AspNetCore.Web project from browser sample (#765) 2020-02-12 08:50:28 +13:00
James Newton-King 1de1aaf3bb
Fix error when client has a very large deadline (#762) 2020-02-12 08:28:30 +13:00
James Newton-King a6f1e476a7
Support large deadlines on the server (#763) 2020-02-11 11:27:02 +13:00
Nikolay Dermendzhiev a1bb10d4a9
Fix wrong message types (#760) 2020-02-09 14:06:20 +13:00
James Newton-King 793bb6564c
Reference gRPC-Web packages instead of projects in samples (#756) 2020-02-07 09:54:29 +13:00
James Newton-King 93d1a3872e
Update Blazor sample (#755) 2020-02-06 13:38:09 +13:00
Albert Lyubarsky de6144f3c8
Enable JavaScript debugging (#750) 2020-02-04 10:49:11 -08:00
Jan Tattermusch b2845043e8 Bump version to 2.28.0-dev on master (#737) 2020-01-27 13:35:12 -08:00
James Newton-King 176fb17794 Update Grpc.Core.Api and Google.Protobuf dependencies (#733) 2020-01-24 07:57:42 +01:00
James Newton-King 8c0f682173
Remove unwanted files from Blazor sample (#728) 2020-01-23 09:22:26 +13:00
James Newton-King d00da897cc
Make CCore benchmark server write consistent startup message (#729) 2020-01-22 18:06:26 +13:00
James Newton-King 0da0662e45
Add gRPC-Web Blazor example (#718) 2020-01-22 10:44:42 +13:00
James Newton-King 0d35b5a60d
Don't log message read cancellation as an error in client (#724) 2020-01-22 10:29:56 +13:00
Vaughan Reid 63d5ac2acc Added test for GrpcProtocol timeout parsing (#727) 2020-01-22 08:21:43 +13:00
James Newton-King 444ff1b0ff
Explicitly specify ready state text in benchmarks (#725) 2020-01-18 11:33:23 +13:00
James Newton-King 8283efe58e
Use new Grpc.Core.Api to get response headers only when requested (#720) 2020-01-17 12:16:57 +13:00
James Newton-King 249dabab70
Add gRPC-Web Browser example (#703) 2020-01-14 09:25:24 +13:00
James Newton-King bee59db0be
gRPC-Web client and server (#695) 2020-01-10 08:04:51 +13:00
John Luo 36e42811e7 Add planning document (#642) 2020-01-07 12:10:23 +13:00
Vaughan Reid 25018df77e Using async main function for benchmark core server. (#711) 2020-01-06 11:53:46 +13:00
James Newton-King ae35982440
Improve error message when SslCredentials has arguments (#706) 2020-01-04 12:34:30 +13:00
James Newton-King 263e54ffdb
Fix two segment paths returning 405 status instead of 404 (#701) 2019-12-28 08:05:09 +13:00
James Newton-King 89a95c3369
Don't log message read cancellation as an error (#697) 2019-12-19 18:42:41 +13:00
James Newton-King dd72d6a38a
Add healthchecks example (#657) 2019-12-12 12:20:44 +13:00
James Newton-King 1e8e31b15d
Add client certificate option to perf benchmarks (#690) 2019-12-11 13:56:34 +13:00
James Newton-King afd37e4d0a
Improve extensibility of gRPC invocation (#669) 2019-12-11 11:09:30 +13:00
James Newton-King dcf6f339ca
Add unary method deadline test (#683) 2019-12-11 08:31:50 +13:00
James Newton-King 60c8feb989
Improve worker example (#684) 2019-12-11 08:02:15 +13:00
Jan Tattermusch 7d9b3406a2
Bump version to 2.27.0-dev on master (#689) 2019-12-10 19:56:54 +01:00
1273 changed files with 130629 additions and 28756 deletions

3
.dockerignore Normal file
View File

@ -0,0 +1,3 @@
**/bin
**/obj
.vs

406
.editorconfig Normal file
View File

@ -0,0 +1,406 @@
; EditorConfig to support per-solution formatting.
; Use the EditorConfig VS add-in to make this work.
; http://editorconfig.org/
;
; Here are some resources for what's supported for .NET/C#
; https://kent-boogaart.com/blog/editorconfig-reference-for-c-developers
; https://learn.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
;
; Be **careful** editing this because some of the rules don't support adding a severity level
; For instance if you change to `dotnet_sort_system_directives_first = true:warning` (adding `:warning`)
; then the rule will be silently ignored.
; This is the default for the codeline.
root = true
[*]
indent_style = space
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.cs]
indent_size = 4
dotnet_sort_system_directives_first = true
# Don't use this. qualifier
dotnet_style_qualification_for_field = false:suggestion
dotnet_style_qualification_for_property = false:suggestion
# use int x = .. over Int32
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
# use int.MaxValue over Int32.MaxValue
dotnet_style_predefined_type_for_member_access = true:suggestion
# Require var all the time.
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
# Disallow throw expressions.
csharp_style_throw_expression = false:suggestion
# Newline settings
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
# Namespace settings
csharp_style_namespace_declarations = file_scoped
# Brace settings
csharp_prefer_braces = true # Prefer curly braces even for one line of code
[*.{xml,config,*proj,nuspec,props,resx,targets,yml,tasks}]
indent_size = 2
# Xml config files
[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}]
indent_size = 2
[*.json]
indent_size = 2
[*.{ps1,psm1}]
indent_size = 4
[*.sh]
indent_size = 4
end_of_line = lf
[*.{razor,cshtml}]
charset = utf-8-bom
[*.{cs,vb}]
# SYSLIB1054: Use 'LibraryImportAttribute' instead of 'DllImportAttribute' to generate P/Invoke marshalling code at compile time
dotnet_diagnostic.SYSLIB1054.severity = warning
# CA1018: Mark attributes with AttributeUsageAttribute
dotnet_diagnostic.CA1018.severity = warning
# CA1047: Do not declare protected member in sealed type
dotnet_diagnostic.CA1047.severity = warning
# CA1305: Specify IFormatProvider
dotnet_diagnostic.CA1305.severity = warning
# CA1507: Use nameof to express symbol names
dotnet_diagnostic.CA1507.severity = warning
# CA1510: Use ArgumentNullException throw helper
dotnet_diagnostic.CA1510.severity = warning
# CA1511: Use ArgumentException throw helper
dotnet_diagnostic.CA1511.severity = warning
# CA1512: Use ArgumentOutOfRangeException throw helper
dotnet_diagnostic.CA1512.severity = warning
# CA1513: Use ObjectDisposedException throw helper
dotnet_diagnostic.CA1513.severity = warning
# CA1725: Parameter names should match base declaration
dotnet_diagnostic.CA1725.severity = suggestion
# CA1802: Use literals where appropriate
dotnet_diagnostic.CA1802.severity = warning
# CA1805: Do not initialize unnecessarily
dotnet_diagnostic.CA1805.severity = warning
# CA1810: Do not initialize unnecessarily
dotnet_diagnostic.CA1810.severity = warning
# CA1821: Remove empty Finalizers
dotnet_diagnostic.CA1821.severity = warning
# CA1822: Make member static
dotnet_diagnostic.CA1822.severity = warning
dotnet_code_quality.CA1822.api_surface = private, internal
# CA1823: Avoid unused private fields
dotnet_diagnostic.CA1823.severity = warning
# CA1825: Avoid zero-length array allocations
dotnet_diagnostic.CA1825.severity = warning
# CA1826: Do not use Enumerable methods on indexable collections. Instead use the collection directly
dotnet_diagnostic.CA1826.severity = warning
# CA1827: Do not use Count() or LongCount() when Any() can be used
dotnet_diagnostic.CA1827.severity = warning
# CA1828: Do not use CountAsync() or LongCountAsync() when AnyAsync() can be used
dotnet_diagnostic.CA1828.severity = warning
# CA1829: Use Length/Count property instead of Count() when available
dotnet_diagnostic.CA1829.severity = warning
# CA1830: Prefer strongly-typed Append and Insert method overloads on StringBuilder
dotnet_diagnostic.CA1830.severity = warning
# CA1831: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
# CA1832: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
# CA1833: Use AsSpan or AsMemory instead of Range-based indexers when appropriate
dotnet_diagnostic.CA1831.severity = warning
dotnet_diagnostic.CA1832.severity = warning
dotnet_diagnostic.CA1833.severity = warning
# CA1834: Consider using 'StringBuilder.Append(char)' when applicable
dotnet_diagnostic.CA1834.severity = warning
# CA1835: Prefer the 'Memory'-based overloads for 'ReadAsync' and 'WriteAsync'
dotnet_diagnostic.CA1835.severity = warning
# CA1836: Prefer IsEmpty over Count
dotnet_diagnostic.CA1836.severity = warning
# CA1837: Use 'Environment.ProcessId'
dotnet_diagnostic.CA1837.severity = warning
# CA1838: Avoid 'StringBuilder' parameters for P/Invokes
dotnet_diagnostic.CA1838.severity = warning
# CA1839: Use 'Environment.ProcessPath'
dotnet_diagnostic.CA1839.severity = warning
# CA1840: Use 'Environment.CurrentManagedThreadId'
dotnet_diagnostic.CA1840.severity = warning
# CA1841: Prefer Dictionary.Contains methods
dotnet_diagnostic.CA1841.severity = warning
# CA1842: Do not use 'WhenAll' with a single task
dotnet_diagnostic.CA1842.severity = warning
# CA1843: Do not use 'WaitAll' with a single task
dotnet_diagnostic.CA1843.severity = warning
# CA1844: Provide memory-based overrides of async methods when subclassing 'Stream'
dotnet_diagnostic.CA1844.severity = warning
# CA1845: Use span-based 'string.Concat'
dotnet_diagnostic.CA1845.severity = warning
# CA1846: Prefer AsSpan over Substring
dotnet_diagnostic.CA1846.severity = warning
# CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters
dotnet_diagnostic.CA1847.severity = warning
# CA1852: Seal internal types
dotnet_diagnostic.CA1852.severity = warning
# CA1854: Prefer the IDictionary.TryGetValue(TKey, out TValue) method
dotnet_diagnostic.CA1854.severity = warning
# CA1855: Prefer 'Clear' over 'Fill'
dotnet_diagnostic.CA1855.severity = warning
# CA1856: Incorrect usage of ConstantExpected attribute
dotnet_diagnostic.CA1856.severity = error
# CA1857: A constant is expected for the parameter
dotnet_diagnostic.CA1857.severity = warning
# CA1858: Use 'StartsWith' instead of 'IndexOf'
dotnet_diagnostic.CA1858.severity = warning
# CA2007: Consider calling ConfigureAwait on the awaited task
dotnet_diagnostic.CA2007.severity = warning
# CA2008: Do not create tasks without passing a TaskScheduler
dotnet_diagnostic.CA2008.severity = warning
# CA2009: Do not call ToImmutableCollection on an ImmutableCollection value
dotnet_diagnostic.CA2009.severity = warning
# CA2011: Avoid infinite recursion
dotnet_diagnostic.CA2011.severity = warning
# CA2012: Use ValueTask correctly
dotnet_diagnostic.CA2012.severity = warning
# CA2013: Do not use ReferenceEquals with value types
dotnet_diagnostic.CA2013.severity = warning
# CA2014: Do not use stackalloc in loops.
dotnet_diagnostic.CA2014.severity = warning
# CA2016: Forward the 'CancellationToken' parameter to methods that take one
dotnet_diagnostic.CA2016.severity = warning
# CA2200: Rethrow to preserve stack details
dotnet_diagnostic.CA2200.severity = warning
# CA2208: Instantiate argument exceptions correctly
dotnet_diagnostic.CA2208.severity = warning
# CA2245: Do not assign a property to itself
dotnet_diagnostic.CA2245.severity = warning
# CA2246: Assigning symbol and its member in the same statement
dotnet_diagnostic.CA2246.severity = warning
# CA2249: Use string.Contains instead of string.IndexOf to improve readability.
dotnet_diagnostic.CA2249.severity = warning
# IDE0005: Remove unnecessary usings
dotnet_diagnostic.IDE0005.severity = warning
# IDE0011: Curly braces to surround blocks of code
dotnet_diagnostic.IDE0011.severity = warning
# IDE0020: Use pattern matching to avoid is check followed by a cast (with variable)
dotnet_diagnostic.IDE0020.severity = warning
# IDE0029: Use coalesce expression (non-nullable types)
dotnet_diagnostic.IDE0029.severity = warning
# IDE0030: Use coalesce expression (nullable types)
dotnet_diagnostic.IDE0030.severity = warning
# IDE0031: Use null propagation
dotnet_diagnostic.IDE0031.severity = warning
# IDE0035: Remove unreachable code
dotnet_diagnostic.IDE0035.severity = warning
# IDE0036: Order modifiers
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion
dotnet_diagnostic.IDE0036.severity = warning
# IDE0038: Use pattern matching to avoid is check followed by a cast (without variable)
dotnet_diagnostic.IDE0038.severity = warning
# IDE0043: Format string contains invalid placeholder
dotnet_diagnostic.IDE0043.severity = warning
# IDE0044: Make field readonly
dotnet_diagnostic.IDE0044.severity = warning
# IDE0051: Remove unused private members
dotnet_diagnostic.IDE0051.severity = warning
# IDE0055: All formatting rules
dotnet_diagnostic.IDE0055.severity = suggestion
# IDE0059: Unnecessary assignment to a value
dotnet_diagnostic.IDE0059.severity = warning
# IDE0060: Remove unused parameter
dotnet_code_quality_unused_parameters = non_public
dotnet_diagnostic.IDE0060.severity = warning
# IDE0062: Make local function static
dotnet_diagnostic.IDE0062.severity = warning
# IDE0161: Convert to file-scoped namespace
dotnet_diagnostic.IDE0161.severity = warning
# IDE0200: Lambda expression can be removed
dotnet_diagnostic.IDE0200.severity = warning
# IDE2000: Disallow multiple blank lines
dotnet_style_allow_multiple_blank_lines_experimental = false
dotnet_diagnostic.IDE2000.severity = warning
[{test,tests,testassets,examples,perf,scripts,stress}/**.cs]
# CA1018: Mark attributes with AttributeUsageAttribute
dotnet_diagnostic.CA1018.severity = suggestion
# CA1507: Use nameof to express symbol names
dotnet_diagnostic.CA1507.severity = suggestion
# CA1510: Use ArgumentNullException throw helper
dotnet_diagnostic.CA1510.severity = suggestion
# CA1511: Use ArgumentException throw helper
dotnet_diagnostic.CA1511.severity = suggestion
# CA1512: Use ArgumentOutOfRangeException throw helper
dotnet_diagnostic.CA1512.severity = suggestion
# CA1513: Use ObjectDisposedException throw helper
dotnet_diagnostic.CA1513.severity = suggestion
# CA1802: Use literals where appropriate
dotnet_diagnostic.CA1802.severity = suggestion
# CA1805: Do not initialize unnecessarily
dotnet_diagnostic.CA1805.severity = suggestion
# CA1810: Do not initialize unnecessarily
dotnet_diagnostic.CA1810.severity = suggestion
# CA1822: Make member static
dotnet_diagnostic.CA1822.severity = suggestion
# CA1823: Avoid zero-length array allocations
dotnet_diagnostic.CA1825.severity = suggestion
# CA1826: Do not use Enumerable methods on indexable collections. Instead use the collection directly
dotnet_diagnostic.CA1826.severity = suggestion
# CA1827: Do not use Count() or LongCount() when Any() can be used
dotnet_diagnostic.CA1827.severity = suggestion
# CA1829: Use Length/Count property instead of Count() when available
dotnet_diagnostic.CA1829.severity = suggestion
# CA1834: Consider using 'StringBuilder.Append(char)' when applicable
dotnet_diagnostic.CA1834.severity = suggestion
# CA1835: Prefer the 'Memory'-based overloads for 'ReadAsync' and 'WriteAsync'
dotnet_diagnostic.CA1835.severity = suggestion
# CA1837: Use 'Environment.ProcessId'
dotnet_diagnostic.CA1837.severity = suggestion
# CA1838: Avoid 'StringBuilder' parameters for P/Invokes
dotnet_diagnostic.CA1838.severity = suggestion
# CA1841: Prefer Dictionary.Contains methods
dotnet_diagnostic.CA1841.severity = suggestion
# CA1844: Provide memory-based overrides of async methods when subclassing 'Stream'
dotnet_diagnostic.CA1844.severity = suggestion
# CA1845: Use span-based 'string.Concat'
dotnet_diagnostic.CA1845.severity = suggestion
# CA1846: Prefer AsSpan over Substring
dotnet_diagnostic.CA1846.severity = suggestion
# CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters
dotnet_diagnostic.CA1847.severity = suggestion
# CA1852: Seal internal types
dotnet_diagnostic.CA1852.severity = suggestion
# CA1854: Prefer the IDictionary.TryGetValue(TKey, out TValue) method
dotnet_diagnostic.CA1854.severity = suggestion
# CA1855: Prefer 'Clear' over 'Fill'
dotnet_diagnostic.CA1855.severity = suggestion
# CA1856: Incorrect usage of ConstantExpected attribute
dotnet_diagnostic.CA1856.severity = suggestion
# CA1857: A constant is expected for the parameter
dotnet_diagnostic.CA1857.severity = suggestion
# CA1858: Use 'StartsWith' instead of 'IndexOf'
dotnet_diagnostic.CA1858.severity = suggestion
# CA2007: Consider calling ConfigureAwait on the awaited task
dotnet_diagnostic.CA2007.severity = suggestion
# CA2008: Do not create tasks without passing a TaskScheduler
dotnet_diagnostic.CA2008.severity = suggestion
# CA2012: Use ValueTask correctly
dotnet_diagnostic.CA2012.severity = suggestion
# CA2249: Use string.Contains instead of string.IndexOf to improve readability.
dotnet_diagnostic.CA2249.severity = suggestion
# IDE0005: Remove unnecessary usings
dotnet_diagnostic.IDE0005.severity = suggestion
# IDE0020: Use pattern matching to avoid is check followed by a cast (with variable)
dotnet_diagnostic.IDE0020.severity = suggestion
# IDE0029: Use coalesce expression (non-nullable types)
dotnet_diagnostic.IDE0029.severity = suggestion
# IDE0030: Use coalesce expression (nullable types)
dotnet_diagnostic.IDE0030.severity = suggestion
# IDE0031: Use null propagation
dotnet_diagnostic.IDE0031.severity = suggestion
# IDE0038: Use pattern matching to avoid is check followed by a cast (without variable)
dotnet_diagnostic.IDE0038.severity = suggestion
# IDE0044: Make field readonly
dotnet_diagnostic.IDE0044.severity = suggestion
# IDE0051: Remove unused private members
dotnet_diagnostic.IDE0051.severity = suggestion
# IDE0059: Unnecessary assignment to a value
dotnet_diagnostic.IDE0059.severity = suggestion
# IDE0060: Remove unused parameters
dotnet_diagnostic.IDE0060.severity = suggestion
# IDE0062: Make local function static
dotnet_diagnostic.IDE0062.severity = suggestion
# IDE0200: Lambda expression can be removed
dotnet_diagnostic.IDE0200.severity = suggestion
# CA2016: Forward the 'CancellationToken' parameter to methods that take one
dotnet_diagnostic.CA2016.severity = suggestion

5
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@ -0,0 +1,5 @@
blank_issues_enabled: true
contact_links:
- name: Issue with Grpc.Core
url: https://github.com/grpc/grpc/issues/new/choose
about: Please open issues relating to Grpc.Core in grpc/grpc.

46
.github/workflows/test.yml vendored Normal file
View File

@ -0,0 +1,46 @@
name: Build and Test
on:
push:
branches: [ master ]
pull_request:
branches: [ '**' ]
schedule:
- cron: 0 0 * * * # daily at 00:00
env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
jobs:
build:
name: Basic Tests
runs-on: ubuntu-22.04
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Install dotnet
run: ./build/get-dotnet.sh
- name: Build and run tests
run: ./build_and_test.sh
- uses: actions/upload-artifact@v4
if: always()
with:
name: artifacts
path: artifacts
if-no-files-found: error
grpc_web:
name: gRPC-Web Tests
runs-on: ubuntu-22.04
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Run interop tests
run: ./grpcweb_interoptests.sh

1
.gitignore vendored
View File

@ -34,7 +34,6 @@ launchSettings.json
BenchmarkDotNet.Artifacts/
BDN.Generated/
binaries/
global.json
.vscode/
*.binlog
build/feed

View File

@ -1,14 +0,0 @@
language: csharp
sudo: required
dist: xenial
env:
global:
- DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
mono: none
branches:
only:
- master
install:
- ./build/get-dotnet.sh
script:
- ./build_and_test.sh

View File

@ -1,6 +1,4 @@
<Project>
<Import Project="build\sources.props" />
<Import Project="build\dependencies.props" />
<Import Project="build\version.props" />
<PropertyGroup>
@ -12,12 +10,23 @@
<AssemblyOriginatorKeyFile>$(MSBuildThisFileDirectory)keys\Grpc.snk</AssemblyOriginatorKeyFile>
<SignAssembly>true</SignAssembly>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CheckEolTargetFramework>false</CheckEolTargetFramework>
<SuppressNETCoreSdkPreviewMessage>true</SuppressNETCoreSdkPreviewMessage>
<!-- Don't make missing XML docs a fatal build error, but still surface so we have visibility into undocumented APIs. -->
<WarningsNotAsErrors>$(WarningsNotAsErrors);CS1591</WarningsNotAsErrors>
<LangVersion>8.0</LangVersion>
<!-- Disable warnings about AOT and trimming features on older targets, e.g. netstandard2.0.
For now, continue to apply these features to these targets because some packages don't have a target that supports them -->
<NoWarn>$(NoWarn);NETSDK1195;NETSDK1210</NoWarn>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<LangVersion>12.0</LangVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<!-- Some packages generate warnings when used on TFMs that are out of support (or almost out of support) -->
<SuppressTfmSupportBuildWarnings>true</SuppressTfmSupportBuildWarnings>
</PropertyGroup>
</Project>

View File

@ -17,14 +17,38 @@
<GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
<CodeAnalysisRuleset>$(MSBuildThisFileDirectory)Grpc.DotNet.ruleset</CodeAnalysisRuleset>
<IsTrimmable>true</IsTrimmable>
<EnableAOTAnalyzer>true</EnableAOTAnalyzer>
</PropertyGroup>
<!-- IsGrpcPublishedPackage is set in csproj so related config must be in targets file -->
<ItemGroup Condition="'$(IsGrpcPublishedPackage)' == 'true'">
<None Include="$(PackageIconFullPath)" Pack="true" PackagePath="\"/>
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="$(MicrosoftCodeAnalysisFxCopAnalyzersPackageVersion)" PrivateAssets="All" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="$(MicrosoftSourceLinkGitHubPackageVersion)" PrivateAssets="All" />
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" PrivateAssets="All" />
<PackageReference Include="Microsoft.SourceLink.GitHub" PrivateAssets="All" />
</ItemGroup>
<ItemGroup Condition="$(MSBuildProjectName.EndsWith('Tests'))">
<Using Include="NUnit.Framework.Legacy.ClassicAssert" Alias="Assert" />
<Using Include="NUnit.Framework.Legacy" />
<Using Include="NUnit.Framework" />
</ItemGroup>
<!--
Make a netstandard2.1 copy of the .net ILLinkPack to work around a trimming issue.
See https://github.com/dotnet/linker/issues/3175
TODO: Remove once .NET 8 + trimming + netstandard2.1 is fixed.
-->
<Target Name="_FixKnownILLinkPack"
BeforeTargets="ProcessFrameworkReferences">
<ItemGroup>
<KnownILLinkPack Include="@(KnownILLinkPack)"
Condition="'%(TargetFramework)' == 'net8.0'"
TargetFramework="netstandard2.1"
ILLinkPackVersion="%(KnownILLinkPack.ILLinkPackVersion)" />
</ItemGroup>
</Target>
</Project>

88
Directory.Packages.props Normal file
View File

@ -0,0 +1,88 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<MicrosoftAspNetCoreAppPackageVersion>10.0.0-preview.6.25358.103</MicrosoftAspNetCoreAppPackageVersion>
<MicrosoftAspNetCoreApp9PackageVersion>9.0.4</MicrosoftAspNetCoreApp9PackageVersion>
<MicrosoftAspNetCoreApp8PackageVersion>8.0.15</MicrosoftAspNetCoreApp8PackageVersion>
<GrpcDotNetPackageVersion>2.70.0</GrpcDotNetPackageVersion>
<OpenTelemetryPackageVersion>1.6.0</OpenTelemetryPackageVersion>
<OpenTelemetryIntergationPackageVersion>1.8.1</OpenTelemetryIntergationPackageVersion>
<OpenTelemetryGrpcPackageVersion>1.8.0-beta.1</OpenTelemetryGrpcPackageVersion>
<MicrosoftExtensionsPackageVersion>10.0.0-preview.6.25358.103</MicrosoftExtensionsPackageVersion>
<MicrosoftExtensionsLtsPackageVersion>8.0.0</MicrosoftExtensionsLtsPackageVersion>
</PropertyGroup>
<ItemGroup>
<!-- ASP.NET Core -->
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Certificate" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Grpc.JsonTranscoding" Version="$(MicrosoftAspNetCoreAppPackageVersion)" />
<PackageVersion Include="Microsoft.AspNetCore.Grpc.Swagger" Version="0.8.0" />
<!-- Extensions -->
<PackageVersion Include="Microsoft.Extensions.Http" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="$(MicrosoftExtensionsPackageVersion)" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="$(MicrosoftExtensionsPackageVersion)" />
<!-- gRPC -->
<PackageVersion Include="Grpc.Tools" Version="2.71.0" />
<PackageVersion Include="Grpc.Core" Version="2.46.6" />
<PackageVersion Include="Grpc.Core.Api" Version="$(GrpcDotNetPackageVersion)"/>
<PackageVersion Include="Grpc.Net.Client" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.Net.Client.Web" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.Net.ClientFactory" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.AspNetCore" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.AspNetCore.Server" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.AspNetCore.Web" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.Reflection" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.AspNetCore.Server.Reflection" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.HealthCheck" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.AspNetCore.HealthChecks" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.Auth" Version="$(GrpcDotNetPackageVersion)" />
<PackageVersion Include="Grpc.StatusProto" Version="$(GrpcDotNetPackageVersion)" />
<!-- OpenTelemetry -->
<PackageVersion Include="OpenTelemetry" Version="$(OpenTelemetryPackageVersion)" />
<PackageVersion Include="OpenTelemetry.Exporter.Zipkin" Version="$(OpenTelemetryPackageVersion)" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="$(OpenTelemetryPackageVersion)" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="$(OpenTelemetryIntergationPackageVersion)" />
<PackageVersion Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="$(OpenTelemetryGrpcPackageVersion)" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="$(OpenTelemetryIntergationPackageVersion)" />
<!-- Other -->
<PackageVersion Include="BenchmarkDotNet" Version="0.15.2" />
<PackageVersion Include="CommandLineParser" Version="2.5.0" />
<PackageVersion Include="Google.Api.CommonProtos" Version="2.16.0" />
<PackageVersion Include="Google.Apis.Auth" Version="1.70.0" />
<PackageVersion Include="Google.Protobuf" Version="3.31.1" />
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0" />
<PackageVersion Include="Microsoft.Build.Locator" Version="1.5.5" />
<PackageVersion Include="Microsoft.Build" Version="17.3.2" />
<PackageVersion Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.0-preview.25358.103" />
<PackageVersion Include="Microsoft.Crank.EventSources" Version="0.2.0-alpha.25128.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
<PackageVersion Include="Microsoft.Win32.Registry" Version="4.6.0" />
<PackageVersion Include="Moq" Version="4.20.70" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="Nunit" Version="4.3.2" />
<PackageVersion Include="NUnit3TestAdapter" Version="5.0.0" />
<PackageVersion Include="protobuf-net.Grpc.AspNetCore" Version="1.0.140" />
<PackageVersion Include="protobuf-net.Grpc" Version="1.0.140" />
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
<PackageVersion Include="System.CommandLine.Rendering" Version="0.4.0-alpha.22272.1" />
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="6.0.1" />
<PackageVersion Include="System.Memory" Version="4.5.3" />
<PackageVersion Include="System.Net.Http.WinHttpHandler" Version="8.0.3" />
<PackageVersion Include="System.Security.Principal.Windows" Version="5.0.0" />
<PackageVersion Include="System.Text.Json" Version="8.0.6" />
<PackageVersion Include="System.Threading.Channels" Version="4.6.0" />
</ItemGroup>
</Project>

View File

@ -1,250 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28527.54
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{8C62055F-8CD7-4859-9001-634D544DF2AE}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{CECC4AE8-9C4E-4727-939B-517CC2E58D65}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.AspNetCore.Server", "src\Grpc.AspNetCore.Server\Grpc.AspNetCore.Server.csproj", "{89ED416F-92F1-4425-9379-D4E76A285860}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.AspNetCore.Server.Tests", "test\Grpc.AspNetCore.Server.Tests\Grpc.AspNetCore.Server.Tests.csproj", "{278B1311-41BF-4345-947E-7B70E277FC3C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.AspNetCore.FunctionalTests", "test\FunctionalTests\Grpc.AspNetCore.FunctionalTests.csproj", "{B190F61D-854C-4EE1-9532-B81AB3215F90}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "perf", "perf", "{4163E1B3-4D75-46B4-9107-9A158FD708FC}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testassets", "testassets", "{59C7B1F0-EE4D-4098-8596-0ADDBC305234}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Proto", "Proto", "{BF1393D4-6099-4EF9-85BB-7EE6CBEB920C}"
ProjectSection(SolutionItems) = preProject
testassets\Proto\any.proto = testassets\Proto\any.proto
testassets\Proto\authorize.proto = testassets\Proto\authorize.proto
testassets\Proto\chat.proto = testassets\Proto\chat.proto
testassets\Proto\compression.proto = testassets\Proto\compression.proto
testassets\Proto\count.proto = testassets\Proto\count.proto
testassets\Proto\greet.proto = testassets\Proto\greet.proto
testassets\Proto\lifetime.proto = testassets\Proto\lifetime.proto
testassets\Proto\nested.proto = testassets\Proto\nested.proto
examples\Proto\race.proto = examples\Proto\race.proto
testassets\Proto\singleton.proto = testassets\Proto\singleton.proto
testassets\Proto\streaming.proto = testassets\Proto\streaming.proto
testassets\Proto\unimplemented.proto = testassets\Proto\unimplemented.proto
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FunctionalTestsWebsite", "testassets\FunctionalTestsWebsite\FunctionalTestsWebsite.csproj", "{7B95289B-4992-4C0D-B26F-8EC58F81FC96}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "benchmarkapps", "benchmarkapps", "{1B8B6117-CE39-4580-BAFA-D8026102767A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkClient", "perf\benchmarkapps\BenchmarkClient\BenchmarkClient.csproj", "{B10D4986-25D2-4414-B500-627D89505914}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{310E5783-455A-4D09-A7AE-39DC2AB09504}"
ProjectSection(SolutionItems) = preProject
perf\benchmarkapps\Shared\benchmark_service.proto = perf\benchmarkapps\Shared\benchmark_service.proto
perf\benchmarkapps\Shared\BenchmarkConfigurationHelpers.cs = perf\benchmarkapps\Shared\BenchmarkConfigurationHelpers.cs
perf\benchmarkapps\Shared\BenchmarkServiceImpl.cs = perf\benchmarkapps\Shared\BenchmarkServiceImpl.cs
perf\benchmarkapps\Shared\messages.proto = perf\benchmarkapps\Shared\messages.proto
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.AspNetCore.Microbenchmarks", "perf\Grpc.AspNetCore.Microbenchmarks\Grpc.AspNetCore.Microbenchmarks.csproj", "{98500D54-FC3F-4A42-B74D-51930C19B175}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InteropTestsWebsite", "testassets\InteropTestsWebsite\InteropTestsWebsite.csproj", "{A551D7B1-D75A-43F0-A8E3-BAEA5EDF616A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BenchmarkWorkerWebsite", "testassets\BenchmarkWorkerWebsite\BenchmarkWorkerWebsite.csproj", "{C3D6C3BD-4E56-4B0F-88FD-4F2D68F0CD25}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Certs", "Certs", "{39320CA8-D8F0-45B6-B704-A04C16870226}"
ProjectSection(SolutionItems) = preProject
perf\benchmarkapps\Shared\Certs\testCert.pfx = perf\benchmarkapps\Shared\Certs\testCert.pfx
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.AspNetCore.Server.Reflection", "src\Grpc.AspNetCore.Server.Reflection\Grpc.AspNetCore.Server.Reflection.csproj", "{55813F20-1269-4B19-B03E-7E4A90148F92}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InteropTestsClient", "testassets\InteropTestsClient\InteropTestsClient.csproj", "{291E5BA5-608D-406D-A2DB-389412D907F3}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Certs", "Certs", "{743F8EC2-004E-4640-B04F-5BAFDA8BF112}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "InteropTests", "InteropTests", "{50CF39FF-2644-4B5F-BE1A-B57487B9723B}"
ProjectSection(SolutionItems) = preProject
testassets\Certs\InteropTests\ca.pem = testassets\Certs\InteropTests\ca.pem
testassets\Certs\InteropTests\README.md = testassets\Certs\InteropTests\README.md
testassets\Certs\InteropTests\server1.key = testassets\Certs\InteropTests\server1.key
testassets\Certs\InteropTests\server1.pem = testassets\Certs\InteropTests\server1.pem
testassets\Certs\InteropTests\server1.pfx = testassets\Certs\InteropTests\server1.pfx
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "grpc", "grpc", "{6DC078D2-8FB1-4685-B9BE-61F1C0ED8053}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testing", "testing", "{88AC787E-603C-48C3-AEBA-D90F3E2142CA}"
ProjectSection(SolutionItems) = preProject
testassets\Proto\grpc\testing\empty.proto = testassets\Proto\grpc\testing\empty.proto
testassets\Proto\grpc\testing\messages.proto = testassets\Proto\grpc\testing\messages.proto
testassets\Proto\grpc\testing\test.proto = testassets\Proto\grpc\testing\test.proto
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InteropTestsNativeServer", "testassets\InteropTestsNativeServer\InteropTestsNativeServer.csproj", "{D15CAEF6-0A5D-416E-B6F7-DE75C4B1D89B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-grpc", "src\dotnet-grpc\dotnet-grpc.csproj", "{EBD5D978-1519-45ED-AC20-EC43C7FA552C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-grpc.Tests", "test\dotnet-grpc.Tests\dotnet-grpc.Tests.csproj", "{265CD0AA-A1BD-40B8-A1E6-B3CB5F7591B8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.AspNetCore.Server.ClientFactory", "src\Grpc.AspNetCore.Server.ClientFactory\Grpc.AspNetCore.Server.ClientFactory.csproj", "{BF9F5674-2BC3-446E-BBEA-3055A4A2B889}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.AspNetCore.Server.ClientFactory.Tests", "test\Grpc.AspNetCore.Server.ClientFactory.Tests\Grpc.AspNetCore.Server.ClientFactory.Tests.csproj", "{4306E048-9D81-44A8-8069-2C294289FC00}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.Net.Client", "src\Grpc.Net.Client\Grpc.Net.Client.csproj", "{095F2B46-16DC-4A2E-A075-A0373D902294}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.Net.Client.Tests", "test\Grpc.Net.Client.Tests\Grpc.Net.Client.Tests.csproj", "{7C299E2C-A5FE-439D-A346-2A676302BD04}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.Net.ClientFactory", "src\Grpc.Net.ClientFactory\Grpc.Net.ClientFactory.csproj", "{F68DBD76-196A-4F55-BBEB-97278655017F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.Net.ClientFactory.Tests", "test\Grpc.Net.ClientFactory.Tests\Grpc.Net.ClientFactory.Tests.csproj", "{0C98BD64-8A57-46A1-B47B-EAF260DEE25A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.AspNetCore", "src\Grpc.AspNetCore\Grpc.AspNetCore.csproj", "{F6CA82C9-85C6-4A5F-B892-4DF8A20B1C05}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Grpc.Net.Common", "src\Grpc.Net.Common\Grpc.Net.Common.csproj", "{69C50655-71EE-4E69-BC2C-ABCA568F6E76}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GrpcAspNetCoreServer", "perf\benchmarkapps\GrpcAspNetCoreServer\GrpcAspNetCoreServer.csproj", "{1D9AB69D-244C-4871-867E-DCEC52B552A4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GrpcCoreServer", "perf\benchmarkapps\GrpcCoreServer\GrpcCoreServer.csproj", "{781111FC-8F3C-433E-BC96-D88ADAEE3064}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{89ED416F-92F1-4425-9379-D4E76A285860}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{89ED416F-92F1-4425-9379-D4E76A285860}.Debug|Any CPU.Build.0 = Debug|Any CPU
{89ED416F-92F1-4425-9379-D4E76A285860}.Release|Any CPU.ActiveCfg = Release|Any CPU
{89ED416F-92F1-4425-9379-D4E76A285860}.Release|Any CPU.Build.0 = Release|Any CPU
{278B1311-41BF-4345-947E-7B70E277FC3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{278B1311-41BF-4345-947E-7B70E277FC3C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{278B1311-41BF-4345-947E-7B70E277FC3C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{278B1311-41BF-4345-947E-7B70E277FC3C}.Release|Any CPU.Build.0 = Release|Any CPU
{B190F61D-854C-4EE1-9532-B81AB3215F90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B190F61D-854C-4EE1-9532-B81AB3215F90}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B190F61D-854C-4EE1-9532-B81AB3215F90}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B190F61D-854C-4EE1-9532-B81AB3215F90}.Release|Any CPU.Build.0 = Release|Any CPU
{7B95289B-4992-4C0D-B26F-8EC58F81FC96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B95289B-4992-4C0D-B26F-8EC58F81FC96}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B95289B-4992-4C0D-B26F-8EC58F81FC96}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B95289B-4992-4C0D-B26F-8EC58F81FC96}.Release|Any CPU.Build.0 = Release|Any CPU
{B10D4986-25D2-4414-B500-627D89505914}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B10D4986-25D2-4414-B500-627D89505914}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B10D4986-25D2-4414-B500-627D89505914}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B10D4986-25D2-4414-B500-627D89505914}.Release|Any CPU.Build.0 = Release|Any CPU
{98500D54-FC3F-4A42-B74D-51930C19B175}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{98500D54-FC3F-4A42-B74D-51930C19B175}.Debug|Any CPU.Build.0 = Debug|Any CPU
{98500D54-FC3F-4A42-B74D-51930C19B175}.Release|Any CPU.ActiveCfg = Release|Any CPU
{98500D54-FC3F-4A42-B74D-51930C19B175}.Release|Any CPU.Build.0 = Release|Any CPU
{A551D7B1-D75A-43F0-A8E3-BAEA5EDF616A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A551D7B1-D75A-43F0-A8E3-BAEA5EDF616A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A551D7B1-D75A-43F0-A8E3-BAEA5EDF616A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A551D7B1-D75A-43F0-A8E3-BAEA5EDF616A}.Release|Any CPU.Build.0 = Release|Any CPU
{C3D6C3BD-4E56-4B0F-88FD-4F2D68F0CD25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C3D6C3BD-4E56-4B0F-88FD-4F2D68F0CD25}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C3D6C3BD-4E56-4B0F-88FD-4F2D68F0CD25}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C3D6C3BD-4E56-4B0F-88FD-4F2D68F0CD25}.Release|Any CPU.Build.0 = Release|Any CPU
{55813F20-1269-4B19-B03E-7E4A90148F92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{55813F20-1269-4B19-B03E-7E4A90148F92}.Debug|Any CPU.Build.0 = Debug|Any CPU
{55813F20-1269-4B19-B03E-7E4A90148F92}.Release|Any CPU.ActiveCfg = Release|Any CPU
{55813F20-1269-4B19-B03E-7E4A90148F92}.Release|Any CPU.Build.0 = Release|Any CPU
{291E5BA5-608D-406D-A2DB-389412D907F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{291E5BA5-608D-406D-A2DB-389412D907F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{291E5BA5-608D-406D-A2DB-389412D907F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{291E5BA5-608D-406D-A2DB-389412D907F3}.Release|Any CPU.Build.0 = Release|Any CPU
{D15CAEF6-0A5D-416E-B6F7-DE75C4B1D89B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D15CAEF6-0A5D-416E-B6F7-DE75C4B1D89B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D15CAEF6-0A5D-416E-B6F7-DE75C4B1D89B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D15CAEF6-0A5D-416E-B6F7-DE75C4B1D89B}.Release|Any CPU.Build.0 = Release|Any CPU
{EBD5D978-1519-45ED-AC20-EC43C7FA552C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EBD5D978-1519-45ED-AC20-EC43C7FA552C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EBD5D978-1519-45ED-AC20-EC43C7FA552C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EBD5D978-1519-45ED-AC20-EC43C7FA552C}.Release|Any CPU.Build.0 = Release|Any CPU
{265CD0AA-A1BD-40B8-A1E6-B3CB5F7591B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{265CD0AA-A1BD-40B8-A1E6-B3CB5F7591B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{265CD0AA-A1BD-40B8-A1E6-B3CB5F7591B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{265CD0AA-A1BD-40B8-A1E6-B3CB5F7591B8}.Release|Any CPU.Build.0 = Release|Any CPU
{BF9F5674-2BC3-446E-BBEA-3055A4A2B889}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BF9F5674-2BC3-446E-BBEA-3055A4A2B889}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BF9F5674-2BC3-446E-BBEA-3055A4A2B889}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BF9F5674-2BC3-446E-BBEA-3055A4A2B889}.Release|Any CPU.Build.0 = Release|Any CPU
{4306E048-9D81-44A8-8069-2C294289FC00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4306E048-9D81-44A8-8069-2C294289FC00}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4306E048-9D81-44A8-8069-2C294289FC00}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4306E048-9D81-44A8-8069-2C294289FC00}.Release|Any CPU.Build.0 = Release|Any CPU
{095F2B46-16DC-4A2E-A075-A0373D902294}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{095F2B46-16DC-4A2E-A075-A0373D902294}.Debug|Any CPU.Build.0 = Debug|Any CPU
{095F2B46-16DC-4A2E-A075-A0373D902294}.Release|Any CPU.ActiveCfg = Release|Any CPU
{095F2B46-16DC-4A2E-A075-A0373D902294}.Release|Any CPU.Build.0 = Release|Any CPU
{7C299E2C-A5FE-439D-A346-2A676302BD04}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7C299E2C-A5FE-439D-A346-2A676302BD04}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7C299E2C-A5FE-439D-A346-2A676302BD04}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7C299E2C-A5FE-439D-A346-2A676302BD04}.Release|Any CPU.Build.0 = Release|Any CPU
{F68DBD76-196A-4F55-BBEB-97278655017F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F68DBD76-196A-4F55-BBEB-97278655017F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F68DBD76-196A-4F55-BBEB-97278655017F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F68DBD76-196A-4F55-BBEB-97278655017F}.Release|Any CPU.Build.0 = Release|Any CPU
{0C98BD64-8A57-46A1-B47B-EAF260DEE25A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C98BD64-8A57-46A1-B47B-EAF260DEE25A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C98BD64-8A57-46A1-B47B-EAF260DEE25A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C98BD64-8A57-46A1-B47B-EAF260DEE25A}.Release|Any CPU.Build.0 = Release|Any CPU
{F6CA82C9-85C6-4A5F-B892-4DF8A20B1C05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F6CA82C9-85C6-4A5F-B892-4DF8A20B1C05}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F6CA82C9-85C6-4A5F-B892-4DF8A20B1C05}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F6CA82C9-85C6-4A5F-B892-4DF8A20B1C05}.Release|Any CPU.Build.0 = Release|Any CPU
{69C50655-71EE-4E69-BC2C-ABCA568F6E76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{69C50655-71EE-4E69-BC2C-ABCA568F6E76}.Debug|Any CPU.Build.0 = Debug|Any CPU
{69C50655-71EE-4E69-BC2C-ABCA568F6E76}.Release|Any CPU.ActiveCfg = Release|Any CPU
{69C50655-71EE-4E69-BC2C-ABCA568F6E76}.Release|Any CPU.Build.0 = Release|Any CPU
{1D9AB69D-244C-4871-867E-DCEC52B552A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1D9AB69D-244C-4871-867E-DCEC52B552A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1D9AB69D-244C-4871-867E-DCEC52B552A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1D9AB69D-244C-4871-867E-DCEC52B552A4}.Release|Any CPU.Build.0 = Release|Any CPU
{781111FC-8F3C-433E-BC96-D88ADAEE3064}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{781111FC-8F3C-433E-BC96-D88ADAEE3064}.Debug|Any CPU.Build.0 = Debug|Any CPU
{781111FC-8F3C-433E-BC96-D88ADAEE3064}.Release|Any CPU.ActiveCfg = Release|Any CPU
{781111FC-8F3C-433E-BC96-D88ADAEE3064}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{89ED416F-92F1-4425-9379-D4E76A285860} = {8C62055F-8CD7-4859-9001-634D544DF2AE}
{278B1311-41BF-4345-947E-7B70E277FC3C} = {CECC4AE8-9C4E-4727-939B-517CC2E58D65}
{B190F61D-854C-4EE1-9532-B81AB3215F90} = {CECC4AE8-9C4E-4727-939B-517CC2E58D65}
{59C7B1F0-EE4D-4098-8596-0ADDBC305234} = {CECC4AE8-9C4E-4727-939B-517CC2E58D65}
{BF1393D4-6099-4EF9-85BB-7EE6CBEB920C} = {59C7B1F0-EE4D-4098-8596-0ADDBC305234}
{7B95289B-4992-4C0D-B26F-8EC58F81FC96} = {59C7B1F0-EE4D-4098-8596-0ADDBC305234}
{1B8B6117-CE39-4580-BAFA-D8026102767A} = {4163E1B3-4D75-46B4-9107-9A158FD708FC}
{B10D4986-25D2-4414-B500-627D89505914} = {1B8B6117-CE39-4580-BAFA-D8026102767A}
{310E5783-455A-4D09-A7AE-39DC2AB09504} = {1B8B6117-CE39-4580-BAFA-D8026102767A}
{98500D54-FC3F-4A42-B74D-51930C19B175} = {4163E1B3-4D75-46B4-9107-9A158FD708FC}
{A551D7B1-D75A-43F0-A8E3-BAEA5EDF616A} = {59C7B1F0-EE4D-4098-8596-0ADDBC305234}
{C3D6C3BD-4E56-4B0F-88FD-4F2D68F0CD25} = {59C7B1F0-EE4D-4098-8596-0ADDBC305234}
{39320CA8-D8F0-45B6-B704-A04C16870226} = {310E5783-455A-4D09-A7AE-39DC2AB09504}
{55813F20-1269-4B19-B03E-7E4A90148F92} = {8C62055F-8CD7-4859-9001-634D544DF2AE}
{291E5BA5-608D-406D-A2DB-389412D907F3} = {59C7B1F0-EE4D-4098-8596-0ADDBC305234}
{743F8EC2-004E-4640-B04F-5BAFDA8BF112} = {59C7B1F0-EE4D-4098-8596-0ADDBC305234}
{50CF39FF-2644-4B5F-BE1A-B57487B9723B} = {743F8EC2-004E-4640-B04F-5BAFDA8BF112}
{6DC078D2-8FB1-4685-B9BE-61F1C0ED8053} = {BF1393D4-6099-4EF9-85BB-7EE6CBEB920C}
{88AC787E-603C-48C3-AEBA-D90F3E2142CA} = {6DC078D2-8FB1-4685-B9BE-61F1C0ED8053}
{D15CAEF6-0A5D-416E-B6F7-DE75C4B1D89B} = {59C7B1F0-EE4D-4098-8596-0ADDBC305234}
{EBD5D978-1519-45ED-AC20-EC43C7FA552C} = {8C62055F-8CD7-4859-9001-634D544DF2AE}
{265CD0AA-A1BD-40B8-A1E6-B3CB5F7591B8} = {CECC4AE8-9C4E-4727-939B-517CC2E58D65}
{BF9F5674-2BC3-446E-BBEA-3055A4A2B889} = {8C62055F-8CD7-4859-9001-634D544DF2AE}
{4306E048-9D81-44A8-8069-2C294289FC00} = {CECC4AE8-9C4E-4727-939B-517CC2E58D65}
{095F2B46-16DC-4A2E-A075-A0373D902294} = {8C62055F-8CD7-4859-9001-634D544DF2AE}
{7C299E2C-A5FE-439D-A346-2A676302BD04} = {CECC4AE8-9C4E-4727-939B-517CC2E58D65}
{F68DBD76-196A-4F55-BBEB-97278655017F} = {8C62055F-8CD7-4859-9001-634D544DF2AE}
{0C98BD64-8A57-46A1-B47B-EAF260DEE25A} = {CECC4AE8-9C4E-4727-939B-517CC2E58D65}
{F6CA82C9-85C6-4A5F-B892-4DF8A20B1C05} = {8C62055F-8CD7-4859-9001-634D544DF2AE}
{69C50655-71EE-4E69-BC2C-ABCA568F6E76} = {8C62055F-8CD7-4859-9001-634D544DF2AE}
{1D9AB69D-244C-4871-867E-DCEC52B552A4} = {1B8B6117-CE39-4580-BAFA-D8026102767A}
{781111FC-8F3C-433E-BC96-D88ADAEE3064} = {1B8B6117-CE39-4580-BAFA-D8026102767A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CD5C2B19-49B4-480A-990C-36D98A719B07}
EndGlobalSection
EndGlobal

90
Grpc.DotNet.slnx Normal file
View File

@ -0,0 +1,90 @@
<Solution>
<Folder Name="/perf/">
<Project Path="perf/Grpc.AspNetCore.Microbenchmarks/Grpc.AspNetCore.Microbenchmarks.csproj" />
</Folder>
<Folder Name="/perf/benchmarkapps/">
<Project Path="perf/benchmarkapps/GrpcAspNetCoreServer/GrpcAspNetCoreServer.csproj" />
<Project Path="perf/benchmarkapps/GrpcClient/GrpcClient.csproj" />
<Project Path="perf/benchmarkapps/GrpcCoreServer/GrpcCoreServer.csproj" />
<Project Path="perf/benchmarkapps/QpsWorker/QpsWorker.csproj" />
</Folder>
<Folder Name="/perf/benchmarkapps/Shared/">
<File Path="perf/benchmarkapps/Shared/BenchmarkConfigurationHelpers.cs" />
<File Path="perf/benchmarkapps/Shared/BenchmarkServiceImpl.cs" />
<File Path="perf/benchmarkapps/Shared/benchmark_service.proto" />
<File Path="perf/benchmarkapps/Shared/messages.proto" />
</Folder>
<Folder Name="/perf/benchmarkapps/Shared/Certs/">
<File Path="perf/benchmarkapps/Shared/Certs/testCert.pfx" />
</Folder>
<Folder Name="/src/">
<Project Path="src/dotnet-grpc/dotnet-grpc.csproj" />
<Project Path="src/Grpc.AspNetCore.HealthChecks/Grpc.AspNetCore.HealthChecks.csproj" />
<Project Path="src/Grpc.AspNetCore.Server.ClientFactory/Grpc.AspNetCore.Server.ClientFactory.csproj" />
<Project Path="src/Grpc.AspNetCore.Server.Reflection/Grpc.AspNetCore.Server.Reflection.csproj" />
<Project Path="src/Grpc.AspNetCore.Server/Grpc.AspNetCore.Server.csproj" />
<Project Path="src/Grpc.AspNetCore.Web/Grpc.AspNetCore.Web.csproj" />
<Project Path="src/Grpc.AspNetCore/Grpc.AspNetCore.csproj" />
<Project Path="src/Grpc.Auth/Grpc.Auth.csproj" />
<Project Path="src/Grpc.Core.Api/Grpc.Core.Api.csproj" />
<Project Path="src/Grpc.HealthCheck/Grpc.HealthCheck.csproj" />
<Project Path="src/Grpc.Net.Client.Web/Grpc.Net.Client.Web.csproj" />
<Project Path="src/Grpc.Net.Client/Grpc.Net.Client.csproj" />
<Project Path="src/Grpc.Net.ClientFactory/Grpc.Net.ClientFactory.csproj" />
<Project Path="src/Grpc.Net.Common/Grpc.Net.Common.csproj" />
<Project Path="src/Grpc.Reflection/Grpc.Reflection.csproj" />
<Project Path="src/Grpc.StatusProto/Grpc.StatusProto.csproj" />
</Folder>
<Folder Name="/tests/">
<Project Path="test/dotnet-grpc.Tests/dotnet-grpc.Tests.csproj" />
<Project Path="test/FunctionalTests/Grpc.AspNetCore.FunctionalTests.csproj" />
<Project Path="test/Grpc.AspNetCore.Server.ClientFactory.Tests/Grpc.AspNetCore.Server.ClientFactory.Tests.csproj" />
<Project Path="test/Grpc.AspNetCore.Server.Tests/Grpc.AspNetCore.Server.Tests.csproj" />
<Project Path="test/Grpc.Core.Api.Tests/Grpc.Core.Api.Tests.csproj" />
<Project Path="test/Grpc.HealthCheck.Tests/Grpc.HealthCheck.Tests.csproj" />
<Project Path="test/Grpc.Net.Client.Tests/Grpc.Net.Client.Tests.csproj" />
<Project Path="test/Grpc.Net.Client.Web.Tests/Grpc.Net.Client.Web.Tests.csproj" />
<Project Path="test/Grpc.Net.ClientFactory.Tests/Grpc.Net.ClientFactory.Tests.csproj" />
<Project Path="test/Grpc.Reflection.Tests/Grpc.Reflection.Tests.csproj" />
<Project Path="test/Grpc.StatusProto.Tests/Grpc.StatusProto.Tests.csproj" />
</Folder>
<Folder Name="/tests/testassets/">
<Project Path="testassets/BenchmarkWorkerWebsite/BenchmarkWorkerWebsite.csproj" />
<Project Path="testassets/FunctionalTestsWebsite/FunctionalTestsWebsite.csproj" />
<Project Path="testassets/InteropTestsClient/InteropTestsClient.csproj" />
<Project Path="testassets/InteropTestsGrpcWebClient/InteropTestsGrpcWebClient.csproj" />
<Project Path="testassets/InteropTestsGrpcWebWebsite/InteropTestsGrpcWebWebsite.csproj" />
<Project Path="testassets/InteropTestsNativeServer/InteropTestsNativeServer.csproj" />
<Project Path="testassets/InteropTestsWebsite/InteropTestsWebsite.csproj" />
<Project Path="testassets/LinkerTestsClient/LinkerTestsClient.csproj" />
<Project Path="testassets/LinkerTestsWebsite/LinkerTestsWebsite.csproj" />
</Folder>
<Folder Name="/tests/testassets/Certs/" />
<Folder Name="/tests/testassets/Certs/InteropTests/">
<File Path="testassets/Certs/InteropTests/ca.pem" />
<File Path="testassets/Certs/InteropTests/README.md" />
<File Path="testassets/Certs/InteropTests/server1.key" />
<File Path="testassets/Certs/InteropTests/server1.pem" />
<File Path="testassets/Certs/InteropTests/server1.pfx" />
</Folder>
<Folder Name="/tests/testassets/Proto/">
<File Path="examples/Proto/race.proto" />
<File Path="testassets/Proto/any.proto" />
<File Path="testassets/Proto/authorize.proto" />
<File Path="testassets/Proto/chat.proto" />
<File Path="testassets/Proto/compression.proto" />
<File Path="testassets/Proto/count.proto" />
<File Path="testassets/Proto/greet.proto" />
<File Path="testassets/Proto/lifetime.proto" />
<File Path="testassets/Proto/nested.proto" />
<File Path="testassets/Proto/singleton.proto" />
<File Path="testassets/Proto/streaming.proto" />
<File Path="testassets/Proto/unimplemented.proto" />
</Folder>
<Folder Name="/tests/testassets/Proto/grpc/" />
<Folder Name="/tests/testassets/Proto/grpc/testing/">
<File Path="testassets/Proto/grpc/testing/empty.proto" />
<File Path="testassets/Proto/grpc/testing/messages.proto" />
<File Path="testassets/Proto/grpc/testing/test.proto" />
</Folder>
</Solution>

View File

@ -8,10 +8,17 @@ See [CONTRIBUTING.md](https://github.com/grpc/grpc-community/blob/master/CONTRIB
for general contribution guidelines.
## Maintainers (in alphabetical order)
- [adityamandaleeka](https://github.com/adityamandaleeka), Microsoft Corporation
- [amcasey](https://github.com/amcasey), Microsoft Corporation
- [apolcyn](https://github.com/apolcyn), Google LLC
- [benjaminpetit](https://github.com/benjaminpetit), Microsoft Corporation
- [BrennanConroy](https://github.com/BrennanConroy), Microsoft Corporation
- [davidfowl](https://github.com/davidfowl), Microsoft Corporation
- [JamesNK](https://github.com/JamesNK), Microsoft Corporation
- [jtattermusch](https://github.com/jtattermusch), Google LLC
- [JunTaoLuo](https://github.com/JunTaoLuo), Microsoft Corporation
- [mgravell](https://github.com/mgravell), Microsoft Corporation
- [ReubenBond](https://github.com/ReubenBond), Microsoft Corporation
- [stanley-cheung](https://github.com/stanley-cheung), Google LLC
## Emeritus Maintainers (in alphabetical order)
- [jtattermusch](https://github.com/jtattermusch)
- [JunTaoLuo](https://github.com/JunTaoLuo)

View File

@ -1,22 +1,23 @@
# gRPC for .NET
## Available now on .NET Core 3.0!
gRPC is a modern, open source, high-performance remote procedure call (RPC) framework that can run anywhere. gRPC enables client and server applications to communicate transparently, and simplifies the building of connected systems.
gRPC functionality for .NET Core 3.0 includes:
gRPC functionality for .NET Core 3.0 or later includes:
* [Grpc.AspNetCore](https://www.nuget.org/packages/Grpc.AspNetCore) &ndash; An ASP.NET Core framework for hosting gRPC services. gRPC on ASP.NET Core integrates with standard ASP.NET Core features like logging, dependency injection (DI), authentication and authorization.
* [Grpc.Net.Client](https://www.nuget.org/packages/Grpc.Net.Client) &ndash; A gRPC client for .NET Core that builds upon the familiar `HttpClient`. The client uses new HTTP/2 functionality in .NET Core.
* [Grpc.Net.ClientFactory](https://www.nuget.org/packages/Grpc.Net.ClientFactory) &ndash; gRPC client integration with `HttpClientFactory`. The client factory allows gRPC clients to be centrally configured and injected into your app with DI.
Please note that gRPC for .NET does not replace [gRPC for C#](https://github.com/grpc/grpc/tree/master/src/csharp) (gRPC C# API over native C-core binaries). These implementations coexist and share many of the same APIs to avoid lock-in. There are currently no plans for one implementation to replace the other one. gRPC for C# is the recommended solution for frameworks that gRPC for .NET does not support, such as .NET Framework.
For more information, see [An introduction to gRPC on .NET](https://docs.microsoft.com/aspnet/core/grpc/).
## gRPC for .NET is now the recommended implementation!
Starting from May 2021, gRPC for .NET is the recommended implemention of gRPC for C#. The original [gRPC for C#](https://github.com/grpc/grpc/tree/master/src/csharp) implementation (distributed as the `Grpc.Core` nuget package) is now in maintenance mode and will be deprecated in the future.
See [blogpost](https://grpc.io/blog/grpc-csharp-future/) for more details.
## To start using gRPC for .NET
The best place to start using gRPC for .NET is the gRPC template that comes with .NET Core 3.0. Use the template to [create a gRPC service website and client](https://docs.microsoft.com/aspnet/core/tutorials/grpc/grpc-start).
The best place to start using gRPC for .NET is the gRPC template that comes with .NET Core 3.0 or later. Use the template to [create a gRPC service website and client](https://docs.microsoft.com/aspnet/core/tutorials/grpc/grpc-start).
For additional examples of using gRPC in .NET refer to https://github.com/grpc/grpc-dotnet/tree/master/examples.
@ -61,14 +62,20 @@ startvs.cmd
To build from the command line:
```
dotnet build Grpc.DotNet.sln
dotnet build Grpc.DotNet.slnx
```
To run tests from the command line:
```
dotnet test Grpc.DotNet.sln
dotnet test Grpc.DotNet.slnx
```
### Alternative implementation using Code-First (external library)
An alternative way to use gRPC in .NET is to define the Protobuf contracts directly in C# using [protobuf-net](https://github.com/protobuf-net/protobuf-net.Grpc).
For more information, see the documentation on [learn.microsoft.com](https://learn.microsoft.com/aspnet/core/grpc/code-first) or the [protobuf-net.Grpc website](https://protobuf-net.github.io/protobuf-net.Grpc/).
## To contribute
Contributions are welcome!

View File

@ -1,26 +0,0 @@
<Project>
<PropertyGroup>
<BenchmarkDotNetPackageVersion>0.11.3</BenchmarkDotNetPackageVersion>
<CommandLineParserPackageVersion>2.3.0</CommandLineParserPackageVersion>
<GoogleProtobufPackageVersion>3.10.0</GoogleProtobufPackageVersion>
<GrpcDotNetPackageVersion>2.25.0</GrpcDotNetPackageVersion> <!-- Only use for example projects -->
<GrpcPackageVersion>2.25.0</GrpcPackageVersion>
<MicrosoftAspNetCorePackageVersion>3.0.0</MicrosoftAspNetCorePackageVersion>
<MicrosoftBuildLocatorPackageVersion>1.2.2</MicrosoftBuildLocatorPackageVersion>
<MicrosoftBuildPackageVersion>16.0.461</MicrosoftBuildPackageVersion>
<MicrosoftCodeAnalysisFxCopAnalyzersPackageVersion>2.9.4</MicrosoftCodeAnalysisFxCopAnalyzersPackageVersion>
<MicrosoftExtensionsPackageVersion>2.1.1</MicrosoftExtensionsPackageVersion>
<MicrosoftExtensions30PackageVersion>3.0.0</MicrosoftExtensions30PackageVersion>
<MicrosoftNETTestSdkPackageVersion>16.2.0</MicrosoftNETTestSdkPackageVersion>
<MicrosoftSourceLinkGitHubPackageVersion>1.0.0-beta2-19367-01</MicrosoftSourceLinkGitHubPackageVersion>
<MicrosoftWin32RegistryLinePackageVersion>4.6.0</MicrosoftWin32RegistryLinePackageVersion>
<MoqPackageVersion>4.10.0</MoqPackageVersion>
<NewtonsoftJsonPackageVersion>12.0.2</NewtonsoftJsonPackageVersion>
<NunitPackageVersion>3.12.0</NunitPackageVersion>
<Nunit3TestAdapterPackageVersion>3.13.0</Nunit3TestAdapterPackageVersion>
<OpenTelemetryPackageVersion>0.2.0-alpha.100</OpenTelemetryPackageVersion>
<SystemCommandLinePackageVersion>0.3.0-alpha.19405.1</SystemCommandLinePackageVersion>
<SystemDiagnosticsDiagnosticSourcePackageVersion>4.5.1</SystemDiagnosticsDiagnosticSourcePackageVersion>
<SystemSecurityPrincipalWindowsPackageVersion>4.6.0</SystemSecurityPrincipalWindowsPackageVersion>
</PropertyGroup>
</Project>

View File

@ -27,4 +27,11 @@ echo "Downloading install script: $install_script_url => $install_script_path"
curl -sSL -o $install_script_path $install_script_url
chmod +x $install_script_path
# Install .NET 8 SDK to run 8.0 test targets
$install_script_path -v 8.0.412 -i $dotnet_install_path
# Install .NET 9 SDK to run 9.0 test targets
$install_script_path -v 9.0.303 -i $dotnet_install_path
# Install .NET version specified by global.json
$install_script_path -v $sdk_version -i $dotnet_install_path

View File

@ -1,21 +0,0 @@
<Project>
<PropertyGroup Label="RestoreSources">
<RestoreSources>
$(RestoreSources);
https://api.nuget.org/v3/index.json;
https://dotnetfeed.blob.core.windows.net/aspnet-aspnetcore/index.json;
https://dotnetfeed.blob.core.windows.net/aspnet-extensions/index.json;
https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json;
https://dotnet.myget.org/F/roslyn/api/v3/index.json;
</RestoreSources>
<RestoreSources Condition="Exists('$(MSBuildThisFileDirectory)feed')">
$(RestoreSources);
$(MSBuildThisFileDirectory)feed;
</RestoreSources>
<!-- The following is used to ingest nightly gRPC packages -->
<RestoreSources>
$(RestoreSources);
https://grpc.jfrog.io/grpc/api/nuget/v3/grpc-nuget-dev;
</RestoreSources>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,32 @@
#!/bin/bash
# Copyright 2022 The gRPC Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Update Grpc.Core.Api's VersionInfo.cs with versions from version.props
set -e
cd "$(dirname "$0")"
# retrieve version strings from version.props
PACKAGE_VERSION=$(grep -o '<GrpcDotnetVersion>.*</GrpcDotnetVersion>' version.props | sed 's/<GrpcDotnetVersion>//' | sed 's/<\/GrpcDotnetVersion>//')
ASSEMBLY_VERSION=$(grep -o '<GrpcDotnetAssemblyVersion>.*</GrpcDotnetAssemblyVersion>' version.props | sed 's/<GrpcDotnetAssemblyVersion>//' | sed 's/<\/GrpcDotnetAssemblyVersion>//')
ASSEMBLY_FILE_VERSION=$(grep -o '<GrpcDotnetAssemblyFileVersion>.*</GrpcDotnetAssemblyFileVersion>' version.props | sed 's/<GrpcDotnetAssemblyFileVersion>//' | sed 's/<\/GrpcDotnetAssemblyFileVersion>//')
# update the contents of src/Grpc.Core.Api/VersionInfo.cs with the version strings
sed -i "s/CurrentVersion = \".*\"/CurrentVersion = \"${PACKAGE_VERSION}\"/g" ../src/Grpc.Core.Api/VersionInfo.cs
sed -i "s/CurrentAssemblyVersion = \".*\"/CurrentAssemblyVersion = \"${ASSEMBLY_VERSION}\"/g" ../src/Grpc.Core.Api/VersionInfo.cs
sed -i "s/CurrentAssemblyFileVersion = \".*\"/CurrentAssemblyFileVersion = \"${ASSEMBLY_FILE_VERSION}\"/g" ../src/Grpc.Core.Api/VersionInfo.cs
echo "Updated version strings in src/Grpc.Core.Api/VersionInfo.cs"

View File

@ -2,13 +2,13 @@
<PropertyGroup>
<!-- package version of grpc-dotnet -->
<GrpcDotnetVersion>2.26.0-dev</GrpcDotnetVersion>
<GrpcDotnetVersion>2.66.0-dev</GrpcDotnetVersion>
<!-- assembly version of grpc-dotnet -->
<GrpcDotnetAssemblyVersion>2.0.0.0</GrpcDotnetAssemblyVersion>
<!-- file version of all grpc-dotnet -->
<GrpcDotnetAssemblyFileVersion>2.26.0.0</GrpcDotnetAssemblyFileVersion>
<GrpcDotnetAssemblyFileVersion>2.66.0.0</GrpcDotnetAssemblyFileVersion>
</PropertyGroup>
</Project>

View File

@ -22,32 +22,21 @@ echo "Building solution"
dotnet build -c Release
echo "Building examples"
example_solutions=( $( ls examples/**/*.sln ) )
example_solutions=( $( ls examples/**/*.slnx ) )
for example_solution in "${example_solutions[@]}"
do
dotnet build $example_solution -c Release
done
echo "Testing solution"
has_failures=false
test_projects=( $( ls test/**/*Tests.csproj ) )
for test_project in "${test_projects[@]}"
do
# "dotnet test" is hanging when it writes to console for an unknown reason
# Tracking issue at https://github.com/microsoft/vstest/issues/2080
# Write test output to a text file and then write the text file to console as a workaround
{
dotnet test $test_project -c Release -v n --no-build &> ${test_project##*/}.log.txt &&
echo "Success" &&
cat ${test_project##*/}.log.txt
} || {
echo "Failure" &&
cat ${test_project##*/}.log.txt &&
exit 1
}
base_name=$(basename ${test_project%.*})
dotnet test $test_project -c Release --no-build --logger "trx;LogFilePrefix=$base_name" --results-directory artifacts/test-results -- NUnit.ConsoleOut=0 || has_failures=true
done
echo "Finished"
if [ "$has_failures" = true ]; then
exit 1
fi

View File

@ -11,23 +11,60 @@ This document summarizes the differences between the two available implementatio
## Criteria for choosing between grpc-dotnet and gRPC C#
One might choose one or the other implementation mostly for one of these reasons
Starting from May 2021, gRPC for .NET is the recommended implemention of gRPC for C#.
The original [gRPC C#](https://github.com/grpc/grpc/tree/master/src/csharp) implementation (distributed as the `Grpc.Core` nuget package) is now in maintenance mode and will be deprecated in the future.
See [blogpost](https://grpc.io/blog/grpc-csharp-future/) for more details.
- avoid use of native code
- ability to use .NET Core 3 and ASP.NET Core 3 (it's a brand new stack so not everyone will be able to use immediately)
- want seamless integration with ASP.NET Core 3, dependency injection etc.
- features available (see breakdown)
- maturity level
- performance (TODO: add data)
Here are some key points in which the two implementation differ:
- grpc-dotnet avoids the use of native code (while Grpc.Core use the native C-core library internally)
- grpc-dotnet requires a newer version of .NET (see the "Framework supported" section)
- grpc-dotnet server integrates seamlessly ASP.NET Core (and allows e.g. dependency injection)
- performance (while data we have data that seems to indicate that grpc-dotnet peforms at least as well as Grpc.Core, we strongly encourage to run your own benchmarks if performance matters for your application)
- features available (see breakdown below)
## Frameworks supported
Grpc.Core supports a wide range of .NET versions, including some very old ones. A more detailed overview is [here]( https://github.com/grpc/grpc/tree/master/src/csharp#supported-platforms)
grpc-dotnet uses features only available in modern .NET releases. It doesn't support some older versions of .NET. A detailed summary of .NET versions supported by grpc-dotnet is [here](https://docs.microsoft.com/aspnet/core/grpc/supported-platforms). There is limited support for [grpc-dotnet client support on
legacy .NET Framework](https://docs.microsoft.com/aspnet/core/grpc/netstandard).
## Comparison of supported features
Beyond the basic RPC functionality, there are a lot of gRPC features that may or may not be supported. The summary
of supported features in both implementation is available in this section.
### Proxyless service mesh (XDS) support
While support for some of the Proxyless service mesh functionality comes "for free" by virtue of using the implementation from C-core native library, we don't officially support the proxyless service mesh functionality in C#.
In grpc-dotnet, we currently don't provide proxyless service mesh support, but it's something that we plan to add in the future. One of the first features we want to integrate is XDS load balancing.
### Load Balancing
grpc-dotnet and Grpc.Core provides basic client load balancing policies PICK_FIRST, ROUND_ROBIN.
Grpc.Core also has implemented two client-lookaside LB policies, but we don't recommend using them:
- grpclb - limited use externally as there's no official implementation of the LB policy. We don't recommend using it as it's been deprecated by the XDS load balancing.
- XDS - Load balancing using the Envoy Universal Data Plane APIs (xDS). It does work in Grpc.Core (because it's implemented in C-core native library), but as noted above, we don't provide official support for the proxyless service mesh functionality in Grpc.Core.
Proxy load balancing is supported by both implementations because load balancing is done by a separate process (e.g. Envoy, ngingx etc.) that proxies the traffic.
grpc-dotnet allows user-provided custom load-balancing policies (= a plugin that provides the load-balancing logic).
Also see:
- https://learn.microsoft.com/aspnet/core/grpc/loadbalancing
- https://github.com/grpc/grpc/blob/master/doc/load-balancing.md
- https://github.com/grpc/grpc/blob/master/doc/naming.md
- https://github.com/grpc/proposal/blob/master/A5-grpclb-in-dns.md
- https://github.com/grpc/proposal/blob/master/A24-lb-policy-config.md
### Service config
Service config is currently only supported by Grpc.Core. Right now the feature is not that useful
Service config is supported by grpc-dotnet and Grpc.Core. Right now, the feature is not that useful
because support for service config encoded in DNS records hasn't been enabled yet by default.
Also see:
@ -45,52 +82,36 @@ Grpc.Core: currently not supported.
Both implementations support client and server interceptors from Grpc.Core.Interceptors namespace. Interceptors operate at post-deserialization and pre-serialization level (no access to binary payloads).
In addition to gRPC-aware interceptors, grpc-dotnet also allows interception at a HTTP/2 level:
In addition to gRPC-aware interceptors, grpc-dotnet also allows interception at an HTTP/2 level:
- Incoming gRPC HTTP/2 requests can be processed using [ASP.NET Core middleware](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/).
- Outgoing gRPC HTTP/2 requests can be processed using [HttpClient HttpMessageHandlers](https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpmessagehandler).
### Load Balancing
Grpc.Core provides basic client load balancing policies PICK_FIRST, ROUND_ROBIN and client-lookaside LB policies:
- grpclb - limited use externally as there's no official implementation of the LB policy
- XDS - Load balancing using the Envoy Universal Data Plane APIs (xDS). Currently this is work in progress but once ready, it will be the LB of choice for lookaside LB.
grpc-dotnet currently doesn't provide any loadbalancing policies. It is likely that to support the XDS loadbalancing policy, features will need to be added to .NET HttpClient.
Proxy loadbalancing is supported by both implementations because loadbalancing is done by a separate process (e.g. Envoy, ngingx etc.) that proxies the traffic.
None of the implementations currently allow user-provided custom loadbalancing policies (= a plugin that provides the loadbalancing logic).
- https://github.com/grpc/grpc/blob/master/doc/load-balancing.md
- https://github.com/grpc/grpc/blob/master/doc/naming.md
- https://github.com/grpc/proposal/blob/master/A5-grpclb-in-dns.md
- https://github.com/grpc/proposal/blob/master/A24-lb-policy-config.md
### Transport support
Both implementations fully support gRPC over HTTP/2 in both TLS and plaintext.
Grpc.Core gets support for other transports supported by C-Core for free. Some (minor) integration work might be required to actually use these transports with gRPC C#.
grpc-dotnet only supports the default transport.
grpc-dotnet supports other transports in .NET 5 or later. For example, grpc-dotnet [supports interprocess communication (IPC)](https://learn.microsoft.com/aspnet/core/grpc/interprocess) using named pipes and Unix domain sockets.
Notes:
- Grpc.Core allows connections over UDS socket (both server and client) on Unix systems. It doesn't support named pipes on windows.
- Grpc.Core supports additional "transports" like ALTS and cfstream thanks to being build on top of C-core.
- Grpc.Core could provide an inprocess transport support but currently this functionality is not exposed in C# API.
- grpc-dotnet support for TLS is platform dependent. TLS is fully supported on Windows and Linux, but doesn't work on MacOS.
- grpc-dotnet support UDS socket on the server-side (On Unix systems, but also on [Windows](https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/))
- grpc-dotnet support for TLS is platform dependent. TLS is fully supported on Windows and Linux. There is limited support for servers hosted on MacOS prior to .NET 8.
### Retries / Request Hedging
Grpc.Core: implementation in C-core in progress, but no ETA yet
grpc-dotnet: not implemented
grpc-dotnet: Retries and hedging are fully supported.
https://github.com/grpc/proposal/blob/master/A6-client-retries.md,
Also see:
- https://learn.microsoft.com/aspnet/core/grpc/retries
- https://github.com/grpc/proposal/blob/master/A6-client-retries.md
### Channelz
@ -112,7 +133,7 @@ https://github.com/grpc/grpc/blob/master/doc/binary-logging.md
Grpc.Core: supported (algorithms: `gzip`, `deflate`)
grpc-dotnet: supported (algorithms: `gzip`), also provides public API to provide custom compression algorithm.
grpc-dotnet: supported (algorithms: `gzip`, `deflate`), also provides public API to provide custom compression algorithm.
Performance implications of using compression in both implementations haven't been measured. Compression functionality is offered mostly to comply with the spec.
@ -123,7 +144,7 @@ https://github.com/grpc/grpc/blob/master/doc/compression_cookbook.md
Grpc.Core: supported (exposed publicly on Channel), provided by C-Core
grpc-dotnet: not supported (to provide support, changes to .NET HttpClient are needed, so adding support is non-trivial).
grpc-dotnet: Supported on .NET 5 or later
https://github.com/grpc/grpc/blob/master/doc/connectivity-semantics-and-api.md
@ -147,7 +168,7 @@ https://github.com/grpc/grpc/blob/master/doc/keepalive.md
Grpc.Core: supported, provided by C-core
grpc-dotnet: not supported (implementing the wait_for_ready flag requires supporting channel connectivity first).
grpc-dotnet: Supported on .NET 5 or later
https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md
@ -155,7 +176,7 @@ https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md
Grpc.Core: conforms with the spec thanks to the C-core dependency. It is currently not possible to provide custom C# resolvers via resolver API (the APIs are in C core and aren't exposed in the C# layer).
grpc-dotnet: only resolves basic DNS names. No API to provide a custom resolver.
grpc-dotnet: Resolving is fully supported on .NET 5 or later. grpc-dotnet also provides an [API to write custom resolvers](https://learn.microsoft.com/aspnet/core/grpc/loadbalancingwrite-custom-resolvers-and-load-balancers).
https://github.com/grpc/grpc/blob/master/doc/naming.md
@ -165,7 +186,7 @@ grpc-dotnet allows port-sharing: serving both gRPC and non-gRPC traffic by the s
## Add-on Features
Features that don't necessarily require changes to implementation's internals. They usually come as a separate opt-in nuget package.
Features that don't necessarily require changes to the implementation's internals. They usually come as a separate opt-in nuget package.
### Addon: Server Reflection
Grpc.Core: supported via Grpc.Reflection nuget package
@ -197,4 +218,22 @@ grpc-dotnet supports integration with `HttpClientFactory` via the Grpc.Net.Clien
- Reuse of channel instances.
- Automatic propagation of cancellation and deadline when used in a `Grpc.AspNetCore` hosted gRPC service.
https://docs.microsoft.com/en-us/aspnet/core/grpc/clientfactory
### Addon: gRPC JSON transcoding
grpc-dotnet supports providing a RESTful JSON API using [gRPC JSON transcoding](https://learn.microsoft.com/aspnet/core/grpc/json-transcoding).
gRPC JSON transcoding is an extension for ASP.NET Core that creates RESTful JSON APIs for gRPC services. Once configured, transcoding allows apps to call gRPC services with familiar HTTP concepts:
- HTTP verbs
- URL parameter binding
- JSON requests/responses
gRPC can still be used to call services.
### Addon: gRPC-Web
grpc-dotnet supports the [gRPC-Web protocol](https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-WEB.md).
gRPC-Web allows browser JavaScript and Blazor apps to call gRPC services. It's not possible to call a gRPC service over HTTP/2 from a browser-based app. gRPC services hosted in ASP.NET Core can be configured to support gRPC-Web alongside gRPC over HTTP/2.
https://learn.microsoft.com/aspnet/core/grpc/grpcweb

112
doc/planning.md Normal file
View File

@ -0,0 +1,112 @@
# gRPC-dotnet future planning (for ASP.NET Core 5.0)
## Schedule and versioning
The work described here targets the ASP.NET Core 5.0 release which is currently scheduled for November 2020: https://github.com/dotnet/core/blob/master/roadmap.md. The version of the gRPC-dotnet release will follow the rules laid out in https://github.com/grpc/grpc-dotnet/blob/master/doc/versioning.md.
## Runtime
- Linker-friendly gRPC
- As part of positioning .NET as a viable technology for cloud native, we should ensure we are linker-friendly and audit any possible future usage of reflection/ref-emit
- Optimize for working-set memory/published output size
- See https://github.com/rynowak/link-a-thon/blob/master/Findings.md for comparison
- Additional Server
- HttpSysServer
- IIS In-proc
- Introduce additional transports on the server
- Unix-domain sockets
- Named pipes (on Windows)
- [Stretch] QUIC
- Introduce additional transports on the client
- Unix-domain sockets
- Named pipes (on Windows)
- [Stretch] QUIC
- Serializer/de-serializer performance improvements
- https://github.com/protocolbuffers/protobuf/pull/5888
- HTTP/2 performance on the server
- HPACK Static dictionary
- HPACK Dynamic dictionary
- Pooling of HTTP/2 Streams
- [Stretch] Window update tuning
- Ensure code-first gRPC is successful
- Marc Gravell is using protobuf.net to build a code-first gRPC experience on grpc-dotnet. Ensure our abstractions allow him to be successful.
- Ensure WCF to gRPC ebook is successful
- Provide SME guidance where applicable
- Testing existing client libraries on both implementations
- There are APIs and SDKs to share between the implementations
- https://github.com/grpc/grpc-dotnet/blob/master/doc/implementation_comparison.md
- Here is the list of client libraries that grpc-dotnet should work with
- https://github.com/googleapis/google-cloud-dotnet
- there's an add-on library https://github.com/GoogleCloudPlatform/grpc-gcp-csharp that is used to provide some of the functionality (like channel affinity) for some of the APIs.
It would also be useful to help with figuring out a way to make the client libraries not depend on Grpc.Core directly (which is currently the case).
- Load balancing
- Integration with XDS load balancing APIs
- May need Connectivity APIs work in HttpClient
- We should start with supporting round_robin loadbalancing as a first step. The features needed for that are very likely to be needed for XDS loadbalancing as well.
- Connection Features
- Keep alive, without keepalive support it can be difficult to have long-lived streaming call that only rarely sends messages (e.g. "client subscribes for receiving updates from server " scenario)
- Connection idle: https://github.com/grpc/grpc/blob/master/doc/connection-backoff.md
- Wait for ready
- These features are often needed for production ready services
- Support status.proto
- Trailing rich metadata for error details
- Works across different implementation
- For details, see "Richer error model" here: https://grpc.io/docs/guides/error/ and also https://cloud.google.com/apis/design/errors#error_model
example what we've done for e.g. python: https://github.com/grpc/proposal/blob/master/L44-python-rich-status.md
the expectation is that we'll ship this as a separate nuget (e.g. "Grpc.StatusProto")
- Channelz support
- Observability of server status
- gRPC web
## Tooling
- [Stretch] Build a LSP for protobuf
- [Stretch] VS Code extension to consume LSP
- [More Info Needed] Possibly partner with VS Code team here
- [Stretch] VS Extension to consume LSP
- Tooling for working with gRPC services without building a client project
- Integration with HttpREPL or something like WCFTestClient?
- Generating and working with client certificates
- Publishing to AKS
## Ecosystem
- Envoy integration
- [Stretch] Integration with Envoy XDS APIs for client-side load balancing
- Kubernetes/AKS
- [More Info Needed] Helm charts for CLI publish
- Xamarin apps support
## Documentation/Samples
- OAuth E2E
- More AuthN/AuthZ coverage
- gRPC specific features
- Deadlines
- Cancellation
- Distributed Tracing
- OpenCenus/Open Telemetry
- Interceptors
## Intentional cuts/omissions
- gRPC with JSON (as opposed to protobuf)

View File

@ -10,8 +10,9 @@ release that the new release depends on.
## Releasing a new version of grpc-dotnet (every 6 weeks)
- Before cutting the release branch
- If needed, on the master branch update the `<GrpcPackageVersion>` dependency version in [dependencies.props](https://github.com/grpc/grpc-dotnet/blob/master/build/dependencies.props)
to the latest pre-release of `Grpc.Core.Api` (that was just released as part of the grpc/grpc release process)
- If needed, on the master branch update the `Grpc.Tools` and `Grpc.Core` dependency versions in [Directory.Packages.props](https://github.com/grpc/grpc-dotnet/blob/master/Directory.Packages.props)
to the latest pre-release of `Grpc.Tools` or `Grpc.Core` (that was released as part of the grpc/grpc release process)
- Make sure that any patches/bugfixes from the last released branch have been applied to the master branch as well.
- Cut the release branch from master branch (the branch format is `v2.25.x`, `v2.26.x`, ...).
@ -19,22 +20,27 @@ release that the new release depends on.
- On the release branch, replace the `-dev` suffix by `-pre1` under `<GrpcDotnetVersion>` version release number in [version.props](https://github.com/grpc/grpc-dotnet/blob/master/build/version.props)
to prepare for building the pre-release nugets.
Also check that the minor version number matches the branch name.
- You'll also need to update `CurrentVersion` field in `Grpc.Core.Api`'s [VersionInfo.cs](https://github.com/grpc/grpc-dotnet/blob/6bbbf3627797ad8f787eced10b0e548cfd9ece15/src/Grpc.Core.Api/VersionInfo.cs#L44) to match the version number (otherwise tests will fail).
- Also check that the minor version number matches the branch name.
- Build the signed nuget packages and push them to nuget.org (internal process). **These are the pre-release packages.**
- Create a new release and tag in https://github.com/grpc/grpc-dotnet/releases (by creating the tag from the current release branch).
Mark the release as "pre-release" in the github UI. Fill in the release notes.
- Wait for the stable release of `Grpc.Core.Api` (as scheduled by the release schedule), keep checking the issue tracker for problems with the new grpc-dotnet pre-release packages.
- Wait for the stable release of `Grpc.Tools` from the `grpc/grpc` repository (as scheduled by the release schedule), keep checking the issue tracker for problems with the new grpc-dotnet pre-release packages.
If problems are discovered and they need to be fixed, the release manager might choose to release more pre-releases (`-pre2`, `-pre3`, ...) before deciding to release as stable.
- **Make sure at least 7 days have elapsed since the last pre-release before proceeding with the stable release**, to give users enough time to test the prerelease nugets and discover potential issues. This is to decrease the likelyhood of pushing a bad stable release.
- Once stable version of `Grpc.Core.Api` is pushed, remove `-pre1` suffix of the `<GrpcDotnetVersion>` version release number in [version.props](https://github.com/grpc/grpc-dotnet/blob/master/build/version.props) to prepare for the stable release.
- Once stable version of `Grpc.Tools` is pushed, remove `-pre1` suffix of the `<GrpcDotnetVersion>` version release number in [version.props](https://github.com/grpc/grpc-dotnet/blob/master/build/version.props) to prepare for the stable release.
- Update `CurrentVersion` field in `Grpc.Core.Api`'s [VersionInfo.cs](https://github.com/grpc/grpc-dotnet/blob/6bbbf3627797ad8f787eced10b0e548cfd9ece15/src/Grpc.Core.Api/VersionInfo.cs#L44) to match the version number (otherwise tests will fail).
- Build the signed nuget packages and push them to nuget.org (internal process). **These are the stable grpc-dotnet packages.**
- Create a new release and tag in https://github.com/grpc/grpc-dotnet/releases (by creating the tag from the current release branch).
This is the stable release. Fill in the release notes.
This is the stable release. Fill in the release notes and list changes since the previous _stable_ version.
### After the release

15
docker-compose.yml Normal file
View File

@ -0,0 +1,15 @@
services:
grpcweb-server:
build:
context: ./
dockerfile: ./testassets/InteropTestsWebsite/Dockerfile
image: grpc-dotnet/grpcweb-server
ports:
- "8080:80"
grpcweb-client:
build:
context: ./
dockerfile: ./testassets/InteropTestsGrpcWebWebsite/Dockerfile
image: grpc-dotnet/grpcweb-client
ports:
- "8081:80"

View File

@ -1,31 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29230.61
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server", "Server\Server.csproj", "{534AC5F8-2DF2-40BD-87A5-B3D8310118C4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Client", "Client\Client.csproj", "{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{534AC5F8-2DF2-40BD-87A5-B3D8310118C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{534AC5F8-2DF2-40BD-87A5-B3D8310118C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{534AC5F8-2DF2-40BD-87A5-B3D8310118C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{534AC5F8-2DF2-40BD-87A5-B3D8310118C4}.Release|Any CPU.Build.0 = Release|Any CPU
{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Release|Any CPU.ActiveCfg = Release|Any CPU
{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D22B3129-3BFB-41FA-9FCE-E45EBEF8C2DD}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,4 @@
<Solution>
<Project Path="Client/Client.csproj" />
<Project Path="Server/Server.csproj" />
</Solution>

View File

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
@ -10,9 +10,9 @@
<Protobuf Include="..\Proto\greet.proto" GrpcServices="None" Link="Protos\greet.proto"/>
<Protobuf Include="..\Proto\count.proto" GrpcServices="None" Link="Protos\count.proto"/>
<PackageReference Include="Google.Protobuf" Version="$(GoogleProtobufPackageVersion)" />
<PackageReference Include="Grpc.Net.Client" Version="$(GrpcDotNetPackageVersion)" />
<PackageReference Include="Grpc.Tools" Version="$(GrpcPackageVersion)" PrivateAssets="All" />
<PackageReference Include="Google.Protobuf" />
<PackageReference Include="Grpc.Net.Client" />
<PackageReference Include="Grpc.Tools" PrivateAssets="All" />
</ItemGroup>
</Project>

View File

@ -16,72 +16,54 @@
#endregion
using System;
using System.Threading;
using System.Threading.Tasks;
using Aggregate;
using Count;
using Greet;
using Grpc.Core;
using Grpc.Net.Client;
namespace Client
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Aggregator.AggregatorClient(channel);
await ServerStreamingCallExample(client);
await ClientStreamingCallExample(client);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
static async Task ServerStreamingCallExample(Aggregator.AggregatorClient client)
{
public class Program
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(3.5));
using var call = client.SayHellos(new HelloRequest { Name = "AggregatorClient" }, cancellationToken: cts.Token);
try
{
static Random RNG = new Random();
static async Task Main(string[] args)
await foreach (var message in call.ResponseStream.ReadAllAsync())
{
var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Aggregator.AggregatorClient(channel);
await ServerStreamingCallExample(client);
await ClientStreamingCallExample(client);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
private static async Task ServerStreamingCallExample(Aggregator.AggregatorClient client)
{
var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(3.5));
using (var replies = client.SayHellos(new HelloRequest { Name = "AggregatorClient" }, cancellationToken: cts.Token))
{
try
{
await foreach (var message in replies.ResponseStream.ReadAllAsync())
{
Console.WriteLine("Greeting: " + message.Message);
}
}
catch (RpcException ex) when (ex.StatusCode == StatusCode.Cancelled)
{
Console.WriteLine("Stream cancelled.");
}
}
}
private static async Task ClientStreamingCallExample(Aggregator.AggregatorClient client)
{
using (var call = client.AccumulateCount())
{
for (var i = 0; i < 3; i++)
{
var count = RNG.Next(5);
Console.WriteLine($"Accumulating with {count}");
await call.RequestStream.WriteAsync(new CounterRequest { Count = count });
await Task.Delay(2000);
}
await call.RequestStream.CompleteAsync();
var response = await call;
Console.WriteLine($"Count: {response.Count}");
}
Console.WriteLine("Greeting: " + message.Message);
}
}
catch (RpcException ex) when (ex.StatusCode == StatusCode.Cancelled)
{
Console.WriteLine("Stream cancelled.");
}
}
static async Task ClientStreamingCallExample(Aggregator.AggregatorClient client)
{
using var call = client.AccumulateCount();
for (var i = 0; i < 3; i++)
{
var count = Random.Shared.Next(5);
Console.WriteLine($"Accumulating with {count}");
await call.RequestStream.WriteAsync(new CounterRequest { Count = count });
await Task.Delay(2000);
}
await call.RequestStream.CompleteAsync();
var response = await call;
Console.WriteLine($"Count: {response.Count}");
}

View File

@ -16,23 +16,59 @@
#endregion
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Count;
using Greet;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using Server;
namespace Server
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
builder.Services.AddSingleton<IncrementingCounter>();
if (bool.TryParse(builder.Configuration["EnableOpenTelemetry"], out var enableOpenTelemetry) && enableOpenTelemetry)
{
public class Program
{
public static void Main(string[] args)
builder.Services.AddOpenTelemetry()
.WithTracing(tracing =>
{
CreateHostBuilder(args).Build().Run();
}
tracing.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("aggregator"));
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
if (builder.Environment.IsDevelopment())
{
// We want to view all traces in development
tracing.SetSampler(new AlwaysOnSampler());
}
tracing.AddAspNetCoreInstrumentation()
.AddGrpcClientInstrumentation()
.AddHttpClientInstrumentation();
tracing.AddZipkinExporter();
});
}
// These clients will call back to the server
builder.Services
.AddGrpcClient<Greeter.GreeterClient>((s, o) => { o.Address = GetCurrentAddress(s); })
.EnableCallContextPropagation();
builder.Services
.AddGrpcClient<Counter.CounterClient>((s, o) => { o.Address = GetCurrentAddress(s); })
.EnableCallContextPropagation();
var app = builder.Build();
app.MapGrpcService<GreeterService>();
app.MapGrpcService<CounterService>();
app.MapGrpcService<AggregatorService>();
app.Run();
static Uri GetCurrentAddress(IServiceProvider serviceProvider)
{
// Get the address of the current server from the request
var context = serviceProvider.GetRequiredService<IHttpContextAccessor>()?.HttpContext;
if (context == null)
{
throw new InvalidOperationException("Could not get HttpContext.");
}
return new Uri($"{context.Request.Scheme}://{context.Request.Host.Value}");
}

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
@ -9,12 +9,13 @@
<Protobuf Include="..\Proto\greet.proto" GrpcServices="Both" Link="Protos\greet.proto" />
<Protobuf Include="..\Proto\count.proto" GrpcServices="Both" Link="Protos\count.proto" />
<PackageReference Include="Grpc.AspNetCore" Version="$(GrpcDotNetPackageVersion)" />
<PackageReference Include="Grpc.AspNetCore" />
<PackageReference Include="OpenTelemetry.Hosting" Version="$(OpenTelemetryPackageVersion)" />
<PackageReference Include="OpenTelemetry.Exporter.Zipkin" Version="$(OpenTelemetryPackageVersion)" />
<PackageReference Include="OpenTelemetry.Collector.Dependencies" Version="$(OpenTelemetryPackageVersion)" />
<PackageReference Include="OpenTelemetry.Collector.AspNetCore" Version="$(OpenTelemetryPackageVersion)" />
<PackageReference Include="OpenTelemetry.Exporter.Zipkin" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.GrpcNetClient" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
</ItemGroup>
</Project>

View File

@ -1,97 +0,0 @@
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using System;
using System.Diagnostics;
using Count;
using Greet;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using OpenTelemetry.Trace.Configuration;
namespace Server
{
public partial class Startup
{
private readonly IConfiguration _configuration;
private const string EnableOpenTelemetryKey = "EnableOpenTelemetry";
public Startup(IConfiguration configuration)
{
_configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
services.AddSingleton<IncrementingCounter>();
if (_configuration.GetValue<bool>(EnableOpenTelemetryKey))
{
services.AddOpenTelemetry(telemetry =>
{
telemetry.UseZipkin(o => o.ServiceName = "aggregator");
telemetry.AddDependencyCollector();
telemetry.AddRequestCollector();
});
}
// These clients will call back to the server
services
.AddGrpcClient<Greeter.GreeterClient>((s, o) => { o.Address = GetCurrentAddress(s); })
.EnableCallContextPropagation();
services
.AddGrpcClient<Counter.CounterClient>((s, o) => { o.Address = GetCurrentAddress(s); })
.EnableCallContextPropagation();
static Uri GetCurrentAddress(IServiceProvider serviceProvider)
{
// Get the address of the current server from the request
var context = serviceProvider.GetRequiredService<IHttpContextAccessor>()?.HttpContext;
if (context == null)
{
throw new InvalidOperationException("Could not get HttpContext.");
}
return new Uri($"{context.Request.Scheme}://{context.Request.Host.Value}");
}
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<GreeterService>();
endpoints.MapGrpcService<CounterService>();
endpoints.MapGrpcService<AggregatorService>();
});
}
}
}

View File

@ -0,0 +1,4 @@
<Solution>
<Project Path="Client/Client.csproj" />
<Project Path="Server/Server.csproj" />
</Solution>

View File

@ -0,0 +1,10 @@
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>

View File

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" PrivateAssets="all" />
<PackageReference Include="Google.Protobuf" />
<PackageReference Include="Grpc.Tools" PrivateAssets="All" />
<PackageReference Include="Grpc.Net.Client" />
<PackageReference Include="Grpc.Net.Client.Web" />
<Protobuf Include="..\Proto\weather.proto" GrpcServices="Client" Link="Protos\weather.proto" Access="Internal" />
<Protobuf Include="..\Proto\count.proto" GrpcServices="Client" Link="Protos\count.proto" Access="Internal" />
</ItemGroup>
</Project>

View File

@ -17,20 +17,20 @@
#endregion
using System;
using System.Diagnostics;
using Grpc.AspNetCore.Server.Model;
using Google.Protobuf.WellKnownTypes;
namespace FunctionalTestsWebsite.Infrastructure
namespace Weather
{
public class DynamicServiceModelProvider : IServiceMethodProvider<DynamicService>
// Properties for the underlying data are generated from the .proto file
// This partial class just adds some extra convenience properties
internal partial class WeatherForecast
{
public Action<ServiceMethodProviderContext<DynamicService>>? CreateMethod { get; set; }
public void OnServiceMethodDiscovery(ServiceMethodProviderContext<DynamicService> context)
public DateTime DateTime
{
Debug.Assert(CreateMethod != null);
CreateMethod(context);
get => Date.ToDateTime();
set { Date = Timestamp.FromDateTime(value.ToUniversalTime()); }
}
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}

View File

@ -0,0 +1,49 @@
@page "/counter"
@inject GrpcChannel Channel
@using Grpc.Core
<h1>Counter</h1>
<p>Current count: @currentCount</p>
<button class="btn btn-primary" @onclick="IncrementCount" disabled="@(cts != null)">Start</button>
<button class="btn btn-primary" @onclick="StopCount" disabled="@(cts == null)">Stop</button>
<div>
<img src="/grpc-logo.png" alt="gRPC logo" />
<p>
Incrementing count streamed from a gRPC service.
</p>
</div>
@code {
private int currentCount = 0;
private CancellationTokenSource? cts;
private async Task IncrementCount()
{
cts = new CancellationTokenSource();
var client = new Count.Counter.CounterClient(Channel);
using var call = client.StartCounter(new CounterRequest() { Start = currentCount }, cancellationToken: cts.Token);
try
{
await foreach (var message in call.ResponseStream.ReadAllAsync())
{
currentCount = message.Count;
StateHasChanged();
}
}
catch (RpcException ex) when (ex.StatusCode == StatusCode.Cancelled)
{
// Ignore exception from cancellation
}
}
private void StopCount()
{
cts?.Cancel();
cts = null;
}
}

View File

@ -0,0 +1,53 @@
@page "/fetchdata"
@inject GrpcChannel Channel
@using Google.Protobuf.WellKnownTypes
<h1>Weather forecast</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.DateTime.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
<div>
<img src="/grpc-logo.png" alt="gRPC logo" />
<p>
Data fetched from a gRPC service.
</p>
</div>
@code {
private IList<WeatherForecast>? forecasts;
protected override async Task OnInitializedAsync()
{
var client = new WeatherForecasts.WeatherForecastsClient(Channel);
forecasts = (await client.GetWeatherForecastsAsync(new Empty())).Forecasts;
}
}

View File

@ -0,0 +1,7 @@
@page "/"
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />

View File

@ -0,0 +1,62 @@
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using System.Net.Http;
using System.Threading.Tasks;
using Grpc.Net.Client;
using Grpc.Net.Client.Web;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace Client
{
public class Program
{
public static async Task Main(string[] args)
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.Services.AddSingleton(services =>
{
// Get the service address from appsettings.json
var config = services.GetRequiredService<IConfiguration>();
var backendUrl = config["BackendUrl"];
// If no address is set then fallback to the current webpage URL
if (string.IsNullOrEmpty(backendUrl))
{
var navigationManager = services.GetRequiredService<NavigationManager>();
backendUrl = navigationManager.BaseUri;
}
// Create a channel with a GrpcWebHandler that is addressed to the backend server.
//
// GrpcWebText is used because server streaming requires it. If server streaming is not used in your app
// then GrpcWeb is recommended because it produces smaller messages.
var httpHandler = new GrpcWebHandler(GrpcWebMode.GrpcWebText, new HttpClientHandler());
return GrpcChannel.ForAddress(backendUrl, new GrpcChannelOptions { HttpHandler = httpHandler });
});
await builder.Build().RunAsync();
}
}
}

View File

@ -0,0 +1,15 @@
@inherits LayoutComponentBase
<div class="sidebar">
<NavMenu />
</div>
<div class="main">
<div class="top-row px-4">
<a href="http://blazor.net" target="_blank" class="ml-md-auto">About</a>
</div>
<div class="content px-4">
@Body
</div>
</div>

View File

@ -0,0 +1,37 @@
<div class="top-row pl-4 navbar navbar-dark">
<a class="navbar-brand" href="">gRPC-Web in Blazor</a>
<button class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
</div>
<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> Counter
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
</NavLink>
</li>
</ul>
</div>
@code {
private bool collapseNavMenu = true;
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
private void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;
}
}

View File

@ -0,0 +1,16 @@
<div class="alert alert-secondary mt-4" role="alert">
<span class="oi oi-pencil mr-2" aria-hidden="true"></span>
<strong>@Title</strong>
<span class="text-nowrap">
Please take our
<a target="_blank" class="font-weight-bold" href="https://go.microsoft.com/fwlink/?linkid=2109206">brief survey</a>
</span>
and tell us what you think.
</div>
@code {
// Demonstrates how a parent component can supply parameters
[Parameter]
public string? Title { get; set; }
}

View File

@ -0,0 +1,11 @@
@using System.Net.Http
@using System.Threading
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.JSInterop
@using Client
@using Client.Shared
@using Count
@using Grpc.Net.Client
@using Weather

View File

@ -0,0 +1,4 @@
{
// Explicit backend URL (override current site)
"BackendUrl": null
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,86 @@
SIL OPEN FONT LICENSE Version 1.1
Copyright (c) 2014 Waybury
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2014 Waybury
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -0,0 +1,114 @@
[Open Iconic v1.1.1](http://useiconic.com/open)
===========
### Open Iconic is the open source sibling of [Iconic](http://useiconic.com). It is a hyper-legible collection of 223 icons with a tiny footprint&mdash;ready to use with Bootstrap and Foundation. [View the collection](http://useiconic.com/open#icons)
## What's in Open Iconic?
* 223 icons designed to be legible down to 8 pixels
* Super-light SVG files - 61.8 for the entire set
* SVG sprite&mdash;the modern replacement for icon fonts
* Webfont (EOT, OTF, SVG, TTF, WOFF), PNG and WebP formats
* Webfont stylesheets (including versions for Bootstrap and Foundation) in CSS, LESS, SCSS and Stylus formats
* PNG and WebP raster images in 8px, 16px, 24px, 32px, 48px and 64px.
## Getting Started
#### For code samples and everything else you need to get started with Open Iconic, check out our [Icons](http://useiconic.com/open#icons) and [Reference](http://useiconic.com/open#reference) sections.
### General Usage
#### Using Open Iconic's SVGs
We like SVGs and we think they're the way to display icons on the web. Since Open Iconic are just basic SVGs, we suggest you display them like you would any other image (don't forget the `alt` attribute).
```
<img src="/open-iconic/svg/icon-name.svg" alt="icon name">
```
#### Using Open Iconic's SVG Sprite
Open Iconic also comes in a SVG sprite which allows you to display all the icons in the set with a single request. It's like an icon font, without being a hack.
Adding an icon from an SVG sprite is a little different than what you're used to, but it's still a piece of cake. *Tip: To make your icons easily style able, we suggest adding a general class to the* `<svg>` *tag and a unique class name for each different icon in the* `<use>` *tag.*
```
<svg class="icon">
<use xlink:href="open-iconic.svg#account-login" class="icon-account-login"></use>
</svg>
```
Sizing icons only needs basic CSS. All the icons are in a square format, so just set the `<svg>` tag with equal width and height dimensions.
```
.icon {
width: 16px;
height: 16px;
}
```
Coloring icons is even easier. All you need to do is set the `fill` rule on the `<use>` tag.
```
.icon-account-login {
fill: #f00;
}
```
To learn more about SVG Sprites, read [Chris Coyier's guide](http://css-tricks.com/svg-sprites-use-better-icon-fonts/).
#### Using Open Iconic's Icon Font...
##### …with Bootstrap
You can find our Bootstrap stylesheets in `font/css/open-iconic-bootstrap.{css, less, scss, styl}`
```
<link href="/open-iconic/font/css/open-iconic-bootstrap.css" rel="stylesheet">
```
```
<span class="oi oi-icon-name" title="icon name" aria-hidden="true"></span>
```
##### …with Foundation
You can find our Foundation stylesheets in `font/css/open-iconic-foundation.{css, less, scss, styl}`
```
<link href="/open-iconic/font/css/open-iconic-foundation.css" rel="stylesheet">
```
```
<span class="fi-icon-name" title="icon name" aria-hidden="true"></span>
```
##### …on its own
You can find our default stylesheets in `font/css/open-iconic.{css, less, scss, styl}`
```
<link href="/open-iconic/font/css/open-iconic.css" rel="stylesheet">
```
```
<span class="oi" data-glyph="icon-name" title="icon name" aria-hidden="true"></span>
```
## License
### Icons
All code (including SVG markup) is under the [MIT License](http://opensource.org/licenses/MIT).
### Fonts
All fonts are under the [SIL Licensed](http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web).

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,543 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2014-7-1: Created.
-->
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>
Created by FontForge 20120731 at Tue Jul 1 20:39:22 2014
By P.J. Onori
Created by P.J. Onori with FontForge 2.0 (http://fontforge.sf.net)
</metadata>
<defs>
<font id="open-iconic" horiz-adv-x="800" >
<font-face
font-family="Icons"
font-weight="400"
font-stretch="normal"
units-per-em="800"
panose-1="2 0 5 3 0 0 0 0 0 0"
ascent="800"
descent="0"
bbox="-0.5 -101 802 800.126"
underline-thickness="50"
underline-position="-100"
unicode-range="U+E000-E0DE"
/>
<missing-glyph />
<glyph glyph-name="" unicode="&#xe000;"
d="M300 700h500v-700h-500v100h400v500h-400v100zM400 500l200 -150l-200 -150v100h-400v100h400v100z" />
<glyph glyph-name="1" unicode="&#xe001;"
d="M300 700h500v-700h-500v100h400v500h-400v100zM200 500v-100h400v-100h-400v-100l-200 150z" />
<glyph glyph-name="2" unicode="&#xe002;"
d="M350 700c193 0 350 -157 350 -350v-50h100l-200 -200l-200 200h100v50c0 138 -112 250 -250 250s-250 -112 -250 -250c0 193 157 350 350 350z" />
<glyph glyph-name="3" unicode="&#xe003;"
d="M450 700c193 0 350 -157 350 -350c0 138 -112 250 -250 250s-250 -112 -250 -250v-50h100l-200 -200l-200 200h100v50c0 193 157 350 350 350z" />
<glyph glyph-name="4" unicode="&#xe004;"
d="M0 700h800v-100h-800v100zM100 500h600v-100h-600v100zM0 300h800v-100h-800v100zM100 100h600v-100h-600v100z" />
<glyph glyph-name="5" unicode="&#xe005;"
d="M0 700h800v-100h-800v100zM0 500h600v-100h-600v100zM0 300h800v-100h-800v100zM0 100h600v-100h-600v100z" />
<glyph glyph-name="6" unicode="&#xe006;"
d="M0 700h800v-100h-800v100zM200 500h600v-100h-600v100zM0 300h800v-100h-800v100zM200 100h600v-100h-600v100z" />
<glyph glyph-name="7" unicode="&#xe007;"
d="M400 700c75 0 146 -23 206 -59l-75 -225l-322 234c57 31 122 50 191 50zM125 588l191 -138l-310 -222c-4 24 -6 47 -6 72c0 114 49 215 125 288zM688 575c69 -72 112 -168 112 -275c0 -35 -8 -68 -16 -100h-218zM216 253l112 -347c-128 23 -232 109 -287 222zM372 100
h372c-64 -109 -177 -185 -310 -197z" />
<glyph glyph-name="8" unicode="&#xe008;" horiz-adv-x="600"
d="M200 800h100v-500h200l-247 -300l-253 300h200v500z" />
<glyph glyph-name="9" unicode="&#xe009;"
d="M400 800c221 0 400 -179 400 -400s-179 -400 -400 -400s-400 179 -400 400s179 400 400 400zM300 700v-300h-200l300 -300l300 300h-200v300h-200z" />
<glyph glyph-name="a" unicode="&#xe00a;"
d="M400 800c221 0 400 -179 400 -400s-179 -400 -400 -400s-400 179 -400 400s179 400 400 400zM400 700l-300 -300l300 -300v200h300v200h-300v200z" />
<glyph glyph-name="b" unicode="&#xe00b;"
d="M400 800c221 0 400 -179 400 -400s-179 -400 -400 -400s-400 179 -400 400s179 400 400 400zM400 700v-200h-300v-200h300v-200l300 300z" />
<glyph glyph-name="c" unicode="&#xe00c;"
d="M400 800c221 0 400 -179 400 -400s-179 -400 -400 -400s-400 179 -400 400s179 400 400 400zM400 700l-300 -300h200v-300h200v300h200z" />
<glyph glyph-name="d" unicode="&#xe00d;"
d="M300 600v-200h500v-100h-500v-200l-300 247z" />
<glyph glyph-name="e" unicode="&#xe00e;"
d="M500 600l300 -247l-300 -253v200h-500v100h500v200z" />
<glyph glyph-name="f" unicode="&#xe00f;" horiz-adv-x="600"
d="M200 800h200v-500h200l-297 -300l-303 300h200v500z" />
<glyph glyph-name="10" unicode="&#xe010;"
d="M300 700v-200h500v-200h-500v-200l-300 297z" />
<glyph glyph-name="11" unicode="&#xe011;"
d="M500 700l300 -297l-300 -303v200h-500v200h500v200z" />
<glyph glyph-name="12" unicode="&#xe012;" horiz-adv-x="600"
d="M297 800l303 -300h-200v-500h-200v500h-200z" />
<glyph glyph-name="13" unicode="&#xe013;" horiz-adv-x="600"
d="M247 800l253 -300h-200v-500h-100v500h-200z" />
<glyph glyph-name="14" unicode="&#xe014;"
d="M400 800h100v-800h-100v800zM200 700h100v-600h-100v600zM600 600h100v-400h-100v400zM0 500h100v-200h-100v200z" />
<glyph glyph-name="15" unicode="&#xe015;"
d="M116 600l72 -72c-54 -54 -88 -126 -88 -209s34 -159 88 -213l-72 -72c-72 72 -116 175 -116 285s44 209 116 281zM684 600c72 -72 116 -171 116 -281s-44 -213 -116 -285l-72 72c54 54 88 130 88 213s-34 155 -88 209zM259 460l69 -72c-18 -18 -28 -41 -28 -69
s10 -54 28 -72l-69 -72c-36 36 -59 89 -59 144s23 105 59 141zM541 459c36 -36 59 -85 59 -140s-23 -108 -59 -144l-69 72c18 18 28 44 28 72s-10 51 -28 69z" />
<glyph glyph-name="16" unicode="&#xe016;" horiz-adv-x="400"
d="M200 800c110 0 200 -90 200 -200s-90 -200 -200 -200s-200 90 -200 200s90 200 200 200zM100 319c31 -11 65 -19 100 -19s68 8 100 19v-319l-100 100l-100 -100v319z" />
<glyph glyph-name="17" unicode="&#xe017;"
d="M400 800c220 0 400 -180 400 -400s-180 -400 -400 -400s-400 180 -400 400s180 400 400 400zM400 700c-166 0 -300 -134 -300 -300c0 -66 21 -126 56 -175l419 419c-49 35 -109 56 -175 56zM644 575l-419 -419c49 -35 109 -56 175 -56c166 0 300 134 300 300
c0 66 -21 126 -56 175z" />
<glyph glyph-name="18" unicode="&#xe018;"
d="M0 700h100v-600h700v-100h-800v700zM500 700h200v-500h-200v500zM200 500h200v-300h-200v300z" />
<glyph glyph-name="19" unicode="&#xe019;"
d="M397 800c13 1 23 -4 34 -13c2 -2 214 -254 241 -287h128v-100h-100v-366c0 -18 -16 -34 -34 -34h-532c-18 0 -34 16 -34 34v366h-100v100h128l234 281c9 11 22 18 35 19zM400 672l-144 -172h288zM250 300c-28 0 -50 -22 -50 -50v-100c0 -28 22 -50 50 -50s50 22 50 50
v100c0 28 -22 50 -50 50zM550 300c-28 0 -50 -22 -50 -50v-100c0 -28 22 -50 50 -50s50 22 50 50v100c0 28 -22 50 -50 50z" />
<glyph glyph-name="1a" unicode="&#xe01a;"
d="M9 700h682c6 0 9 -4 9 -10v-190h100v-200h-100v-191c0 -6 -3 -9 -9 -9h-682c-6 0 -9 3 -9 9v582c0 6 3 9 9 9zM100 600v-400h500v400h-500z" />
<glyph glyph-name="1b" unicode="&#xe01b;"
d="M9 700h682c6 0 9 -4 9 -10v-190h100v-200h-100v-191c0 -6 -3 -9 -9 -9h-682c-6 0 -9 3 -9 9v582c0 6 3 9 9 9z" />
<glyph glyph-name="1c" unicode="&#xe01c;"
d="M92 650c0 23 19 50 45 50h3h5h5h500c28 0 50 -22 50 -50s-22 -50 -50 -50h-50v-141c9 -17 120 -231 166 -309c16 -26 34 -61 34 -106c0 -39 -15 -77 -41 -103h-3c-26 -25 -62 -41 -100 -41h-512c-39 0 -77 15 -103 41s-41 64 -41 103c0 46 18 80 34 106
c46 78 157 292 166 309v141h-50c-2 0 -6 -1 -8 -1c-28 0 -50 23 -50 51zM500 600h-200v-162l-6 -10s-63 -123 -119 -228h450c-56 105 -119 228 -119 228l-6 10v162z" />
<glyph glyph-name="1d" unicode="&#xe01d;"
d="M400 800c110 0 200 -90 200 -200c0 -104 52 -198 134 -266c41 -34 66 -82 66 -134h-800c0 52 25 100 66 134c82 68 134 162 134 266c0 110 90 200 200 200zM300 100h200c0 -55 -45 -100 -100 -100s-100 45 -100 100z" />
<glyph glyph-name="1e" unicode="&#xe01e;" horiz-adv-x="600"
d="M150 800h50l350 -250l-225 -147l225 -153l-350 -250h-50v250l-75 -75l-75 75l150 150l-150 150l75 75l75 -75v250zM250 650v-200l150 100zM250 350v-200l150 100z" />
<glyph glyph-name="1f" unicode="&#xe01f;"
d="M0 800h500c110 0 200 -90 200 -200c0 -47 -17 -91 -44 -125c85 -40 144 -125 144 -225c0 -138 -112 -250 -250 -250h-550v100c55 0 100 45 100 100v400c0 55 -45 100 -100 100v100zM300 700v-200h100c55 0 100 45 100 100s-45 100 -100 100h-100zM300 400v-300h150
c83 0 150 67 150 150s-67 150 -150 150h-150z" />
<glyph glyph-name="20" unicode="&#xe020;" horiz-adv-x="600"
d="M300 800v-300h200l-300 -500v300h-200z" />
<glyph glyph-name="21" unicode="&#xe021;"
d="M100 800h300v-300l100 100l100 -100v300h50c28 0 50 -22 50 -50v-550h-550c-28 0 -50 -22 -50 -50s22 -50 50 -50h550v-100h-550c-83 0 -150 67 -150 150v550l3 19c8 39 39 70 78 78z" />
<glyph glyph-name="22" unicode="&#xe022;" horiz-adv-x="400"
d="M0 800h400v-800l-200 200l-200 -200v800z" />
<glyph glyph-name="23" unicode="&#xe023;"
d="M0 800h800v-100h-800v100zM0 600h300v-103h203v103h297v-591c0 -6 -3 -9 -9 -9h-782c-6 0 -9 3 -9 9v591z" />
<glyph glyph-name="24" unicode="&#xe024;"
d="M300 800h200c55 0 100 -45 100 -100v-100h191c6 0 9 -3 9 -9v-241c0 -28 -22 -50 -50 -50h-700c-28 0 -50 22 -50 50v241c0 6 3 9 9 9h191v100c0 55 45 100 100 100zM300 700v-100h200v100h-200zM0 209c16 -6 32 -9 50 -9h700c18 0 34 3 50 9v-200c0 -6 -3 -9 -9 -9h-782
c-6 0 -9 3 -9 9v200z" />
<glyph glyph-name="25" unicode="&#xe025;" horiz-adv-x="600"
d="M300 800c58 0 110 -16 147 -53s53 -89 53 -147h-100c0 39 -11 61 -25 75s-36 25 -75 25c-35 0 -55 -10 -72 -31s-28 -55 -28 -94c0 -51 20 -107 28 -175h172v-100h-178c-14 -60 -49 -127 -113 -200h491v-100h-600v122l16 12c69 69 95 121 106 166h-122v100h125
c-8 50 -25 106 -25 175c0 58 16 114 50 156c34 43 88 69 150 69z" />
<glyph glyph-name="26" unicode="&#xe026;"
d="M34 700h4h3h4h5h700c28 0 50 -22 50 -50v-700c0 -28 -22 -50 -50 -50h-700c-28 0 -50 22 -50 50v700v2c0 20 15 42 34 48zM150 600c-28 0 -50 -22 -50 -50s22 -50 50 -50s50 22 50 50s-22 50 -50 50zM350 600c-28 0 -50 -22 -50 -50s22 -50 50 -50h300c28 0 50 22 50 50
s-22 50 -50 50h-300zM100 400v-400h600v400h-600z" />
<glyph glyph-name="27" unicode="&#xe027;"
d="M744 797l6 -3l44 -44c4 -4 3 -8 0 -12l-266 -375l-15 -13l-25 -12c-23 72 -78 127 -150 150l12 25l13 15l375 266zM266 400c74 0 134 -60 134 -134c0 -147 -119 -266 -266 -266c-48 0 -95 12 -134 34c80 46 134 133 134 232c0 74 58 134 132 134z" />
<glyph glyph-name="28" unicode="&#xe028;"
d="M9 451c0 23 19 50 46 50c8 0 19 -3 26 -7l131 -66l29 22c-79 81 -1 250 118 250s197 -167 119 -250l28 -22l131 66c6 4 12 7 21 7c28 0 50 -22 50 -50c0 -17 -12 -37 -27 -45l-115 -56c9 -16 19 -33 25 -50h68c28 0 50 -22 50 -50s-22 -50 -50 -50h-50
c0 -23 -2 -45 -6 -66l78 -40c21 -5 37 -28 37 -49c0 -28 -22 -50 -50 -50c-10 0 -23 5 -31 11l-65 35c-24 -46 -62 -86 -103 -110c-35 19 -60 45 -60 72v135v4v5v6v5v5v87c0 28 -22 50 -50 50c-24 0 -45 -17 -50 -40c1 -3 1 -8 1 -11s0 -8 -1 -11v-82v-4v-5v-144
c0 -28 -24 -53 -59 -72c-41 25 -79 64 -103 110l-66 -35c-8 -6 -21 -11 -31 -11c-28 0 -50 22 -50 50c0 21 16 44 37 49l78 40c-4 21 -6 43 -6 66h-50h-5c-28 0 -50 22 -50 50c0 26 22 50 50 50h5h69c6 17 16 34 25 50l-116 56c-16 7 -28 27 -28 45z" />
<glyph glyph-name="29" unicode="&#xe029;"
d="M600 700h91c6 0 9 -3 9 -9v-582c0 -6 -3 -9 -9 -9h-91v600zM210 503l290 147v-500l-250 125v-3c-15 0 -25 -8 -28 -22l75 -178c11 -25 0 -58 -25 -69s-58 0 -69 25l-103 272h-91c-6 0 -9 3 -9 9v182c0 6 3 9 9 9h182z" />
<glyph glyph-name="2a" unicode="&#xe02a;"
d="M9 800h682c6 0 9 -3 9 -9v-782c0 -6 -3 -9 -9 -9h-682c-6 0 -9 3 -9 9v782c0 6 3 9 9 9zM100 700v-200h500v200h-500zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400v-300h100v300h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100z" />
<glyph glyph-name="2b" unicode="&#xe02b;"
d="M0 800h700v-200h-700v200zM0 500h700v-491c0 -6 -3 -9 -9 -9h-682c-6 0 -9 3 -9 9v491zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100z" />
<glyph glyph-name="2c" unicode="&#xe02c;"
d="M409 800h182c6 0 10 -4 12 -9l94 -182c2 -5 6 -9 12 -9h82c6 0 9 -3 9 -9v-582c0 -6 -3 -9 -9 -9h-782c-6 0 -9 3 -9 9v441c0 83 67 150 150 150h141c6 0 10 4 12 9l94 182c2 5 6 9 12 9zM150 500c-28 0 -50 -22 -50 -50s22 -50 50 -50s50 22 50 50s-22 50 -50 50z
M500 500c-110 0 -200 -90 -200 -200s90 -200 200 -200s200 90 200 200s-90 200 -200 200zM500 400c55 0 100 -45 100 -100s-45 -100 -100 -100s-100 45 -100 100s45 100 100 100z" />
<glyph glyph-name="2d" unicode="&#xe02d;"
d="M0 600h800l-400 -400z" />
<glyph glyph-name="2e" unicode="&#xe02e;" horiz-adv-x="400"
d="M400 800v-800l-400 400z" />
<glyph glyph-name="2f" unicode="&#xe02f;" horiz-adv-x="400"
d="M0 800l400 -400l-400 -400v800z" />
<glyph glyph-name="30" unicode="&#xe030;"
d="M400 600l400 -400h-800z" />
<glyph glyph-name="31" unicode="&#xe031;"
d="M0 550c0 23 20 50 46 50h3h5h4h200c17 0 37 -13 44 -28l38 -72h444c14 0 19 -12 15 -25l-81 -250c-4 -13 -21 -25 -35 -25h-350c-14 0 -30 12 -34 25c-27 83 -54 167 -81 250l-10 25h-150c-2 0 -5 -1 -7 -1c-28 0 -51 23 -51 51zM358 100c28 0 50 -22 50 -50
s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50zM658 100c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50z" />
<glyph glyph-name="32" unicode="&#xe032;"
d="M0 700h500v-100h-300v-300h-100l-100 -100v500zM300 500h500v-500l-100 100h-400v400z" />
<glyph glyph-name="33" unicode="&#xe033;"
d="M641 700l143 -141l-493 -493c-71 76 -146 148 -219 222l-72 71l141 141c50 -51 101 -101 153 -150c116 117 234 231 347 350z" />
<glyph glyph-name="34" unicode="&#xe034;"
d="M150 600l250 -250l250 250l150 -150l-400 -400l-400 400z" />
<glyph glyph-name="35" unicode="&#xe035;" horiz-adv-x="600"
d="M400 800l150 -150l-250 -250l250 -250l-150 -150l-400 400z" />
<glyph glyph-name="36" unicode="&#xe036;" horiz-adv-x="600"
d="M150 800l400 -400l-400 -400l-150 150l250 250l-250 250z" />
<glyph glyph-name="37" unicode="&#xe037;"
d="M400 600l400 -400l-150 -150l-250 250l-250 -250l-150 150z" />
<glyph glyph-name="38" unicode="&#xe038;"
d="M400 800c221 0 400 -179 400 -400s-179 -400 -400 -400s-400 179 -400 400s179 400 400 400zM600 622l-250 -250l-100 100l-72 -72l172 -172l322 322z" />
<glyph glyph-name="39" unicode="&#xe039;"
d="M400 800c221 0 400 -179 400 -400s-179 -400 -400 -400s-400 179 -400 400s179 400 400 400zM250 622l-72 -72l150 -150l-150 -150l72 -72l150 150l150 -150l72 72l-150 150l150 150l-72 72l-150 -150z" />
<glyph glyph-name="3a" unicode="&#xe03a;"
d="M350 800c28 0 50 -22 50 -50v-50h75c14 0 25 -11 25 -25v-75h-300v75c0 14 11 25 25 25h75v50c0 28 22 50 50 50zM25 700h75v-200h500v200h75c14 0 25 -11 25 -25v-650c0 -14 -11 -25 -25 -25h-650c-14 0 -25 11 -25 25v650c0 14 11 25 25 25z" />
<glyph glyph-name="3b" unicode="&#xe03b;"
d="M400 800c220 0 400 -180 400 -400s-180 -400 -400 -400s-400 180 -400 400s180 400 400 400zM400 700c-166 0 -300 -134 -300 -300s134 -300 300 -300s300 134 300 300s-134 300 -300 300zM350 600h100v-181c23 -24 47 -47 72 -69l-72 -72c-27 30 -55 59 -84 88l-16 12
v222z" />
<glyph glyph-name="3c" unicode="&#xe03c;"
d="M450 800c138 0 250 -112 250 -250v-50c58 -21 100 -85 100 -150c0 -18 -3 -34 -9 -50h-191v50c0 83 -67 150 -150 150s-150 -67 -150 -150v-50h-272c-17 30 -28 63 -28 100c0 110 90 200 200 200c23 114 129 200 250 200zM434 400h3h4c3 0 6 1 9 1c28 0 50 -22 50 -50v-1
v-150h150l-200 -200l-200 200h150v150v2c0 20 15 42 34 48z" />
<glyph glyph-name="3d" unicode="&#xe03d;"
d="M450 800c138 0 250 -112 250 -250v-50c58 -21 100 -85 100 -150c0 -18 -3 -34 -9 -50h-141l-200 200l-200 -200h-222c-17 30 -28 63 -28 100c0 110 90 200 200 200c23 114 129 200 250 200zM450 350l250 -250h-200v-50c0 -28 -22 -50 -50 -50s-50 22 -50 50v50h-200z" />
<glyph glyph-name="3e" unicode="&#xe03e;"
d="M450 700c138 0 250 -112 250 -250v-50c58 -21 100 -85 100 -150c0 -83 -67 -150 -150 -150h-450c-110 0 -200 90 -200 200s90 200 200 200c23 114 129 200 250 200z" />
<glyph glyph-name="3f" unicode="&#xe03f;"
d="M250 800c82 0 154 -40 200 -100c-143 0 -270 -85 -325 -209c-36 -10 -70 -25 -100 -47c-16 33 -25 67 -25 106c0 138 112 250 250 250zM450 600c138 0 250 -112 250 -250v-50c58 -21 100 -85 100 -150c0 -83 -67 -150 -150 -150h-450c-110 0 -200 90 -200 200
s90 200 200 200c23 114 129 200 250 200z" />
<glyph glyph-name="40" unicode="&#xe040;"
d="M500 700h100l-300 -600h-100zM100 600h100l-100 -200l100 -200h-100l-100 200zM600 600h100l100 -200l-100 -200h-100l100 200z" />
<glyph glyph-name="41" unicode="&#xe041;"
d="M350 800h100l50 -119l28 -12l119 50l72 -72l-50 -119l12 -28l119 -50v-100l-119 -50l-12 -28l50 -119l-72 -72l-119 50l-28 -12l-50 -119h-100l-50 119l-28 12l-119 -50l-72 72l50 119l-12 28l-119 50v100l119 50l12 28l-50 119l72 72l119 -50l28 12zM400 550
c-83 0 -150 -67 -150 -150s67 -150 150 -150s150 67 150 150s-67 150 -150 150z" />
<glyph glyph-name="42" unicode="&#xe042;"
d="M0 800h800v-200h-800v200zM200 500h400l-200 -200zM0 100h800v-100h-800v100z" />
<glyph glyph-name="43" unicode="&#xe043;"
d="M0 800h100v-800h-100v800zM600 800h200v-800h-200v800zM500 600v-400l-200 200z" />
<glyph glyph-name="44" unicode="&#xe044;"
d="M0 800h200v-800h-200v800zM700 800h100v-800h-100v800zM300 600l200 -200l-200 -200v400z" />
<glyph glyph-name="45" unicode="&#xe045;"
d="M0 800h800v-100h-800v100zM400 500l200 -200h-400zM0 200h800v-200h-800v200z" />
<glyph glyph-name="46" unicode="&#xe046;"
d="M150 700c83 0 150 -67 150 -150v-50h100v50c0 83 67 150 150 150s150 -67 150 -150s-67 -150 -150 -150h-50v-100h50c83 0 150 -67 150 -150s-67 -150 -150 -150s-150 67 -150 150v50h-100v-50c0 -83 -67 -150 -150 -150s-150 67 -150 150s67 150 150 150h50v100h-50
c-83 0 -150 67 -150 150s67 150 150 150zM150 600c-28 0 -50 -22 -50 -50s22 -50 50 -50h50v50c0 28 -22 50 -50 50zM550 600c-28 0 -50 -22 -50 -50v-50h50c28 0 50 22 50 50s-22 50 -50 50zM300 400v-100h100v100h-100zM150 200c-28 0 -50 -22 -50 -50s22 -50 50 -50
s50 22 50 50v50h-50zM500 200v-50c0 -28 22 -50 50 -50s50 22 50 50s-22 50 -50 50h-50z" />
<glyph glyph-name="47" unicode="&#xe047;"
d="M0 791c0 5 4 9 9 9h782c6 0 9 -4 9 -10v-790l-200 200h-591c-6 0 -9 3 -9 9v582z" />
<glyph glyph-name="48" unicode="&#xe048;"
d="M400 800c220 0 400 -180 400 -400s-180 -400 -400 -400s-400 180 -400 400s180 400 400 400zM400 700c-166 0 -300 -134 -300 -300s134 -300 300 -300s300 134 300 300s-134 300 -300 300zM600 600l-100 -300l-300 -100l100 300zM400 450c-28 0 -50 -22 -50 -50
s22 -50 50 -50s50 22 50 50s-22 50 -50 50z" />
<glyph glyph-name="49" unicode="&#xe049;"
d="M400 800c220 0 400 -180 400 -400s-180 -400 -400 -400s-400 180 -400 400s180 400 400 400zM400 700v-600c166 0 300 134 300 300s-134 300 -300 300z" />
<glyph glyph-name="4a" unicode="&#xe04a;"
d="M0 800h800v-100h-800v100zM0 600h500v-100h-500v100zM0 300h800v-100h-800v100zM0 100h600v-100h-600v100zM750 100c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50z" />
<glyph glyph-name="4b" unicode="&#xe04b;"
d="M25 700h750c14 0 25 -11 25 -25v-75h-800v75c0 14 11 25 25 25zM0 500h800v-375c0 -14 -11 -25 -25 -25h-750c-14 0 -25 11 -25 25v375zM100 300v-100h100v100h-100zM300 300v-100h100v100h-100z" />
<glyph glyph-name="4c" unicode="&#xe04c;"
d="M100 800h100v-100h450l100 100l50 -50l-100 -100v-450h100v-100h-100v-100h-100v100h-500v500h-100v100h100v100zM200 600v-350l350 350h-350zM600 550l-350 -350h350v350z" />
<glyph glyph-name="4d" unicode="&#xe04d;"
d="M400 800c220 0 400 -180 400 -400s-180 -400 -400 -400s-400 180 -400 400s180 400 400 400zM400 700c-166 0 -300 -134 -300 -300s134 -300 300 -300s300 134 300 300s-134 300 -300 300zM400 600c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50z
M200 452c0 20 15 42 34 48h3h3h8c12 0 28 -7 36 -16l91 -90l25 6c55 0 100 -45 100 -100s-45 -100 -100 -100s-100 45 -100 100l6 25l-90 91c-9 8 -16 24 -16 36zM550 500c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50z" />
<glyph glyph-name="4e" unicode="&#xe04e;"
d="M300 800h200v-300h200l-300 -300l-300 300h200v300zM0 100h800v-100h-800v100z" />
<glyph glyph-name="4f" unicode="&#xe04f;"
d="M0 800h800v-100h-800v100zM400 600l300 -300h-200v-300h-200v300h-200z" />
<glyph glyph-name="50" unicode="&#xe050;"
d="M200 700h600v-600h-600l-200 300zM350 622l-72 -72l150 -150l-150 -150l72 -72l150 150l150 -150l72 72l-150 150l150 150l-72 72l-150 -150z" />
<glyph glyph-name="51" unicode="&#xe051;"
d="M400 700c220 0 400 -180 400 -400h-100c0 166 -134 300 -300 300s-300 -134 -300 -300h-100c0 220 180 400 400 400zM341 491l59 -88l59 88c81 -25 141 -101 141 -191c0 -110 -90 -200 -200 -200s-200 90 -200 200c0 90 60 166 141 191z" />
<glyph glyph-name="52" unicode="&#xe052;"
d="M0 800h300v-400h400v-400h-700v800zM400 800l300 -300h-300v300zM100 600v-100h100v100h-100zM100 400v-100h100v100h-100zM100 200v-100h400v100h-400z" />
<glyph glyph-name="53" unicode="&#xe053;" horiz-adv-x="600"
d="M200 700h100v-100h75c30 0 58 -6 81 -22s44 -44 44 -78v-100h-100v94c-4 3 -13 6 -25 6h-250c-14 0 -25 -11 -25 -25v-50c0 -15 20 -40 34 -44l257 -65c66 -16 109 -73 109 -141v-50c0 -68 -57 -125 -125 -125h-75v-100h-100v100h-75c-30 0 -58 6 -81 22s-44 44 -44 78
v100h100v-94c4 -3 13 -6 25 -6h250c14 0 25 11 25 25v50c0 15 -20 40 -34 44l-257 65c-66 16 -109 73 -109 141v50c0 68 57 125 125 125h75v100z" />
<glyph glyph-name="54" unicode="&#xe054;"
d="M0 700h300v-300l-300 -300v600zM500 700h300v-300l-300 -300v600z" />
<glyph glyph-name="55" unicode="&#xe055;"
d="M300 700v-600h-300v300zM800 700v-600h-300v300z" />
<glyph glyph-name="56" unicode="&#xe056;"
d="M300 700v-100c-111 0 -200 -89 -200 -200h200v-300h-300v300c0 165 135 300 300 300zM800 700v-100c-111 0 -200 -89 -200 -200h200v-300h-300v300c0 165 135 300 300 300z" />
<glyph glyph-name="57" unicode="&#xe057;"
d="M0 700h300v-300c0 -165 -135 -300 -300 -300v100c111 0 200 89 200 200h-200v300zM500 700h300v-300c0 -165 -135 -300 -300 -300v100c111 0 200 89 200 200h-200v300z" />
<glyph glyph-name="58" unicode="&#xe058;" horiz-adv-x="600"
d="M300 800l34 -34c11 -11 266 -270 266 -488c0 -165 -135 -300 -300 -300s-300 135 -300 300c0 218 255 477 266 488zM150 328c-28 0 -50 -22 -50 -50c0 -110 90 -200 200 -200c28 0 50 22 50 50s-22 50 -50 50c-55 0 -100 45 -100 100c0 28 -22 50 -50 50z" />
<glyph glyph-name="59" unicode="&#xe059;"
d="M400 800l400 -500h-800zM0 200h800v-200h-800v200z" />
<glyph glyph-name="5a" unicode="&#xe05a;" horiz-adv-x="600"
d="M300 800l300 -300h-600zM0 300h600l-300 -300z" />
<glyph glyph-name="5b" unicode="&#xe05b;"
d="M0 500h200v-200h-200v200zM300 500h200v-200h-200v200zM600 500h200v-200h-200v200z" />
<glyph glyph-name="5c" unicode="&#xe05c;"
d="M0 700h800v-100l-400 -200l-400 200v100zM0 500l400 -200l400 200v-400h-800v400z" />
<glyph glyph-name="5d" unicode="&#xe05d;"
d="M400 800l400 -200v-600h-800v600zM400 688l-300 -150v-188l300 -150l300 150v188zM200 500h400v-100l-200 -100l-200 100v100z" />
<glyph glyph-name="5e" unicode="&#xe05e;"
d="M600 700c69 0 134 -19 191 -50l-16 -106c-49 35 -109 56 -175 56c-131 0 -240 -84 -281 -200h331l-16 -100h-334c0 -36 8 -68 19 -100h297l-16 -100h-222c55 -61 133 -100 222 -100c78 0 147 30 200 78v-122c-59 -35 -127 -56 -200 -56c-147 0 -274 82 -344 200h-256
l19 100h197c-8 32 -16 66 -16 100h-200l25 100h191c45 172 198 300 384 300z" />
<glyph glyph-name="5f" unicode="&#xe05f;"
d="M0 700h700v-100h-700v100zM0 500h500v-100h-500v100zM0 300h800v-100h-800v100zM0 100h100v-100h-100v100zM200 100h100v-100h-100v100zM400 100h100v-100h-100v100z" />
<glyph glyph-name="60" unicode="&#xe060;"
d="M0 800h800v-100h-800v100zM200 600h400l-200 -200zM0 200h800v-200h-800v200z" />
<glyph glyph-name="61" unicode="&#xe061;"
d="M0 800h100v-800h-100v800zM600 800h200v-800h-200v800zM200 600l200 -200l-200 -200v400z" />
<glyph glyph-name="62" unicode="&#xe062;"
d="M0 800h200v-800h-200v800zM700 800h100v-800h-100v800zM600 600v-400l-200 200z" />
<glyph glyph-name="63" unicode="&#xe063;"
d="M0 800h800v-200h-800v200zM400 400l200 -200h-400zM0 100h800v-100h-800v100z" />
<glyph glyph-name="64" unicode="&#xe064;"
d="M0 800h200v-100h-100v-600h600v100h100v-200h-800v800zM400 800h400v-400l-150 150l-250 -250l-100 100l250 250z" />
<glyph glyph-name="65" unicode="&#xe065;"
d="M403 700c247 0 397 -300 397 -300s-150 -300 -397 -300c-253 0 -403 300 -403 300s150 300 403 300zM400 600c-110 0 -200 -90 -200 -200s90 -200 200 -200s200 90 200 200s-90 200 -200 200zM400 500c10 0 19 -3 28 -6c-16 -8 -28 -24 -28 -44c0 -28 22 -50 50 -50
c20 0 36 12 44 28c3 -9 6 -18 6 -28c0 -55 -45 -100 -100 -100s-100 45 -100 100s45 100 100 100z" />
<glyph glyph-name="66" unicode="&#xe066;" horiz-adv-x="900"
d="M331 700h3h3c3 1 7 1 10 1c12 0 29 -8 37 -17l94 -93l66 65c57 57 155 57 212 0c58 -58 58 -154 0 -212l-65 -66l93 -94c10 -8 18 -25 18 -38c0 -28 -22 -50 -50 -50c-13 0 -32 9 -40 20l-62 65l-381 -381h-269v272l375 381l-63 63c-9 8 -16 24 -16 36c0 20 16 42 35 48z
M447 481l-313 -315l128 -132l316 316z" />
<glyph glyph-name="67" unicode="&#xe067;"
d="M0 800h300v-400h400v-400h-700v800zM400 800l300 -300h-300v300z" />
<glyph glyph-name="68" unicode="&#xe068;"
d="M200 800c0 0 200 -100 200 -300s-298 -302 -200 -500c0 0 -200 100 -200 300s300 300 200 500zM500 500c0 0 200 -100 200 -300c0 -150 -60 -200 -100 -200h-300c0 200 300 300 200 500z" />
<glyph glyph-name="69" unicode="&#xe069;"
d="M0 800h100v-800h-100v800zM200 800h300v-100h300l-200 -203l200 -197h-400v100h-200v400z" />
<glyph glyph-name="6a" unicode="&#xe06a;" horiz-adv-x="400"
d="M150 800h150l-100 -200h200l-150 -300h150l-300 -300l-100 300h134l66 200h-200z" />
<glyph glyph-name="6b" unicode="&#xe06b;"
d="M0 800h300v-100h500v-100h-800v200zM0 500h800v-450c0 -28 -22 -50 -50 -50h-700c-28 0 -50 22 -50 50v450z" />
<glyph glyph-name="6c" unicode="&#xe06c;"
d="M150 800c83 0 150 -67 150 -150c0 -66 -41 -121 -100 -141v-118c15 5 33 9 50 9h200c28 0 50 22 50 50v59c-59 20 -100 75 -100 141c0 83 67 150 150 150s150 -67 150 -150c0 -66 -41 -121 -100 -141v-59c0 -82 -68 -150 -150 -150h-200c-14 0 -25 -7 -34 -16
c50 -24 84 -74 84 -134c0 -83 -67 -150 -150 -150s-150 67 -150 150c0 66 41 121 100 141v218c-59 20 -100 75 -100 141c0 83 67 150 150 150z" />
<glyph glyph-name="6d" unicode="&#xe06d;"
d="M0 800h400l-150 -150l150 -150l-100 -100l-150 150l-150 -150v400zM500 400l150 -150l150 150v-400h-400l150 150l-150 150z" />
<glyph glyph-name="6e" unicode="&#xe06e;"
d="M100 800l150 -150l150 150v-400h-400l150 150l-150 150zM400 400h400l-150 -150l150 -150l-100 -100l-150 150l-150 -150v400z" />
<glyph glyph-name="6f" unicode="&#xe06f;"
d="M400 800c221 0 400 -179 400 -400s-179 -400 -400 -400s-400 179 -400 400s179 400 400 400zM400 700c-56 0 -108 -17 -153 -44l22 -19c33 -18 13 -48 -13 -59c-30 -13 -77 10 -65 -41c13 -55 -27 -3 -47 -15c-42 -26 49 -152 31 -156l-59 34c-8 0 -13 -5 -16 -10
c1 -30 10 -57 19 -84c28 -11 77 -2 100 -25c47 -28 97 -115 75 -159c34 -13 68 -22 106 -22c101 0 193 48 247 125c3 24 -8 44 -50 44c-69 0 -156 13 -153 97c2 46 101 108 66 143c-30 30 12 39 12 66c0 37 -65 32 -69 50s20 36 41 56c-30 10 -60 19 -94 19zM631 591
c-38 -11 -94 -35 -87 -53c6 -15 52 -1 65 -13c11 -10 16 -59 44 -31l22 22v3c-11 26 -26 50 -44 72z" />
<glyph glyph-name="70" unicode="&#xe070;"
d="M703 800l97 -100l-400 -400l-100 100l-200 -203l-100 100l300 303l100 -100zM0 100h800v-100h-800v100z" />
<glyph glyph-name="71" unicode="&#xe071;"
d="M0 700h100v-100h-100v100zM200 700h100v-100h-100v100zM400 700h100v-100h-100v100zM600 700h100v-100h-100v100zM0 500h100v-100h-100v100zM200 500h100v-100h-100v100zM400 500h100v-100h-100v100zM600 500h100v-100h-100v100zM0 300h100v-100h-100v100zM200 300h100
v-100h-100v100zM400 300h100v-100h-100v100zM600 300h100v-100h-100v100zM0 100h100v-100h-100v100zM200 100h100v-100h-100v100zM400 100h100v-100h-100v100zM600 100h100v-100h-100v100z" />
<glyph glyph-name="72" unicode="&#xe072;"
d="M0 800h200v-200h-200v200zM300 800h200v-200h-200v200zM600 800h200v-200h-200v200zM0 500h200v-200h-200v200zM300 500h200v-200h-200v200zM600 500h200v-200h-200v200zM0 200h200v-200h-200v200zM300 200h200v-200h-200v200zM600 200h200v-200h-200v200z" />
<glyph glyph-name="73" unicode="&#xe073;"
d="M0 800h300v-300h-300v300zM500 800h300v-300h-300v300zM0 300h300v-300h-300v300zM500 300h300v-300h-300v300z" />
<glyph glyph-name="74" unicode="&#xe074;"
d="M19 800h662c11 0 19 -8 19 -19v-331c0 -28 -22 -50 -50 -50h-600c-28 0 -50 22 -50 50v331c0 11 8 19 19 19zM0 309c16 -6 32 -9 50 -9h600c18 0 34 3 50 9v-290c0 -11 -8 -19 -19 -19h-662c-11 0 -19 8 -19 19v290zM550 200c-28 0 -50 -22 -50 -50s22 -50 50 -50
s50 22 50 50s-22 50 -50 50z" />
<glyph glyph-name="75" unicode="&#xe075;"
d="M0 700h300v-100h-50c-28 0 -50 -22 -50 -50v-150h300v150c0 28 -22 50 -50 50h-50v100h300v-100h-50c-28 0 -50 -22 -50 -50v-400c0 -28 22 -50 50 -50h50v-100h-300v100h50c28 0 50 22 50 50v150h-300v-150c0 -28 22 -50 50 -50h50v-100h-300v100h50c28 0 50 22 50 50
v400c0 28 -22 50 -50 50h-50v100z" />
<glyph glyph-name="76" unicode="&#xe076;"
d="M400 700c165 0 300 -135 300 -300v-100h50c28 0 50 -22 50 -50v-200c0 -28 -22 -50 -50 -50h-100c-28 0 -50 22 -50 50v350c0 111 -89 200 -200 200s-200 -89 -200 -200v-350c0 -28 -22 -50 -50 -50h-100c-28 0 -50 22 -50 50v200c0 28 22 50 50 50h50v100
c0 165 135 300 300 300z" />
<glyph glyph-name="77" unicode="&#xe077;"
d="M0 500c0 109 91 200 200 200s200 -91 200 -200c0 109 91 200 200 200s200 -91 200 -200c0 -55 -23 -105 -59 -141l-341 -340l-341 340c-36 36 -59 86 -59 141z" />
<glyph glyph-name="78" unicode="&#xe078;"
d="M400 700l400 -300l-100 3v-403h-200v200h-200v-200h-200v400h-100z" />
<glyph glyph-name="79" unicode="&#xe079;"
d="M0 800h800v-800h-800v800zM100 700v-300l100 100l400 -400h100v100l-200 200l100 100l100 -100v300h-600z" />
<glyph glyph-name="7a" unicode="&#xe07a;"
d="M19 800h762c11 0 19 -8 19 -19v-762c0 -11 -8 -19 -19 -19h-762c-11 0 -19 8 -19 19v762c0 11 8 19 19 19zM100 600v-300h100l100 -100h200l100 100h100v300h-600z" />
<glyph glyph-name="7b" unicode="&#xe07b;"
d="M200 600c80 0 142 -56 200 -122c58 66 119 122 200 122c131 0 200 -101 200 -200s-69 -200 -200 -200c-81 0 -142 56 -200 122c-58 -66 -121 -122 -200 -122c-131 0 -200 101 -200 200s69 200 200 200zM200 500c-74 0 -100 -54 -100 -100s26 -100 100 -100
c42 0 88 47 134 100c-46 53 -92 100 -134 100zM600 500c-43 0 -88 -47 -134 -100c46 -53 91 -100 134 -100c74 0 100 54 100 100s-26 100 -100 100z" />
<glyph glyph-name="7c" unicode="&#xe07c;" horiz-adv-x="400"
d="M300 800c55 0 100 -45 100 -100s-45 -100 -100 -100s-100 45 -100 100s45 100 100 100zM150 550c83 0 150 -69 150 -150c0 -66 -100 -214 -100 -250c0 -28 22 -50 50 -50s50 22 50 50h100c0 -83 -67 -150 -150 -150s-150 64 -150 150s100 222 100 250s-22 50 -50 50
s-50 -22 -50 -50h-100c0 83 67 150 150 150z" />
<glyph glyph-name="7d" unicode="&#xe07d;"
d="M200 800h500v-100h-122c-77 -197 -156 -392 -234 -588l-6 -12h162v-100h-500v100h122c77 197 156 392 234 588l7 12h-163v100z" />
<glyph glyph-name="7e" unicode="&#xe07e;"
d="M0 700h800v-100h-800v100zM0 500h800v-100h-800v100zM0 300h800v-100h-800v100zM100 100h600v-100h-600v100z" />
<glyph glyph-name="7f" unicode="&#xe07f;"
d="M0 700h800v-100h-800v100zM0 500h800v-100h-800v100zM0 300h800v-100h-800v100zM0 100h600v-100h-600v100z" />
<glyph glyph-name="80" unicode="&#xe080;"
d="M0 700h800v-100h-800v100zM0 500h800v-100h-800v100zM0 300h800v-100h-800v100zM200 100h600v-100h-600v100z" />
<glyph glyph-name="81" unicode="&#xe081;"
d="M550 800c138 0 250 -112 250 -250s-112 -250 -250 -250c-16 0 -32 0 -47 3l-3 -3v-100h-200v-200h-300v200l303 303c-3 15 -3 31 -3 47c0 138 112 250 250 250zM600 700c-55 0 -100 -45 -100 -100s45 -100 100 -100s100 45 100 100s-45 100 -100 100z" />
<glyph glyph-name="82" unicode="&#xe082;"
d="M134 600h3h4h4h5h500c28 0 50 -22 50 -50v-350h100v-150c0 -28 -22 -50 -50 -50h-700c-28 0 -50 22 -50 50v150h100v350v2c0 20 15 42 34 48zM200 500v-300h100v-100h200v100h100v300h-400z" />
<glyph glyph-name="83" unicode="&#xe083;"
d="M0 800h400v-400h-400v400zM500 600h100v-400h-400v100h300v300zM700 400h100v-400h-400v100h300v300z" />
<glyph glyph-name="84" unicode="&#xe084;" horiz-adv-x="600"
d="M337 694c6 4 12 7 21 7c28 0 50 -22 50 -50c0 -17 -12 -37 -27 -45l-300 -150c-8 -6 -21 -11 -31 -11c-28 0 -50 22 -50 50c0 21 16 44 37 49zM437 544c6 4 12 7 21 7c28 0 50 -22 50 -50c0 -17 -12 -37 -27 -45l-400 -200c-8 -6 -21 -11 -31 -11c-28 0 -50 22 -50 50
c0 21 16 44 37 49zM437 344c6 4 12 7 21 7c28 0 50 -22 50 -50c0 -17 -12 -37 -27 -45l-106 -56c24 -4 43 -26 43 -50c0 -28 -23 -51 -51 -51c-2 0 -6 1 -8 1h-200c-26 1 -48 24 -48 50c0 16 12 36 26 44zM151 -50c0 23 20 50 46 50h3h4h5h100c28 0 50 -22 50 -50
s-22 -50 -50 -50h-100c-2 0 -6 -1 -8 -1c-28 0 -50 23 -50 51z" />
<glyph glyph-name="85" unicode="&#xe085;"
d="M199 800h100v-200h-200v100h100v100zM586 797h1c18 1 38 1 56 -3c36 -8 69 -26 97 -54c78 -78 78 -203 0 -281l-150 -150c-8 -13 -28 -24 -43 -24c-28 0 -50 22 -50 50c0 15 11 35 24 43l150 150c40 40 39 105 0 144c-41 41 -110 34 -144 0l-44 -44
c-8 -13 -27 -24 -42 -24c-28 0 -50 22 -50 50c0 15 11 35 24 43l43 44c32 33 72 53 128 56zM208 490c4 5 14 16 22 16h3c2 0 6 1 8 1c28 0 50 -22 50 -50c0 -11 -6 -27 -14 -35l-150 -150c-40 -40 -39 -105 0 -144c41 -41 110 -34 144 0l44 44c8 13 27 24 42 24
c28 0 50 -22 50 -50c0 -15 -11 -35 -24 -43l-43 -44c-22 -22 -48 -37 -75 -47c-70 -25 -151 -9 -207 47c-78 78 -78 203 0 281zM499 200h200v-100h-100v-100h-100v200z" />
<glyph glyph-name="86" unicode="&#xe086;"
d="M586 797c18 1 39 1 57 -3c36 -8 69 -26 97 -54c78 -78 78 -203 0 -281l-150 -150c-62 -62 -132 -81 -182 -78s-69 17 -84 25s-26 27 -26 44c0 28 22 51 50 51c8 0 19 -3 26 -7c0 0 15 -11 41 -13s62 3 106 47l150 150c40 40 39 105 0 144c-41 41 -110 34 -144 0
c-8 -13 -28 -24 -43 -24c-28 0 -50 22 -50 50c0 15 11 35 24 43c32 33 72 53 128 56zM386 566c50 -2 64 -17 85 -22s37 -28 37 -49c0 -28 -22 -50 -50 -50c-10 0 -23 5 -31 11c0 0 -19 9 -47 10s-63 -4 -103 -44l-150 -150c-40 -40 -39 -105 0 -144c41 -41 110 -34 144 0
c8 13 27 24 42 24c28 0 50 -22 50 -50c0 -15 -10 -35 -23 -43c-22 -22 -48 -37 -75 -47c-70 -25 -151 -9 -207 47c-78 78 -78 203 0 281l150 150c60 60 128 78 178 76z" />
<glyph glyph-name="87" unicode="&#xe087;"
d="M0 700h300v-300h-300v300zM400 700h400v-100h-400v100zM400 500h300v-100h-300v100zM0 300h300v-300h-300v300zM400 300h400v-100h-400v100zM400 100h300v-100h-300v100z" />
<glyph glyph-name="88" unicode="&#xe088;"
d="M50 700c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50zM200 700h600v-100h-600v100zM50 500c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50zM200 500h600v-100h-600v100zM50 300c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50
s22 50 50 50zM200 300h600v-100h-600v100zM50 100c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50zM200 100h600v-100h-600v100z" />
<glyph glyph-name="89" unicode="&#xe089;"
d="M800 800l-400 -800l-100 300l-300 100z" />
<glyph glyph-name="8a" unicode="&#xe08a;" horiz-adv-x="600"
d="M300 700c110 0 200 -90 200 -200v-100h100v-400h-600v400h100v100c0 110 90 200 200 200zM300 600c-56 0 -100 -44 -100 -100v-100h200v100c0 56 -44 100 -100 100z" />
<glyph glyph-name="8b" unicode="&#xe08b;" horiz-adv-x="600"
d="M300 800c110 0 200 -90 200 -200v-200h100v-400h-600v400h400v200c0 56 -44 100 -100 100s-100 -44 -100 -100h-100c0 110 90 200 200 200z" />
<glyph glyph-name="8c" unicode="&#xe08c;"
d="M400 700v-100c-111 0 -200 -89 -200 -200h100l-150 -200l-150 200h100c0 165 135 300 300 300zM650 600l150 -200h-100c0 -165 -135 -300 -300 -300v100c111 0 200 89 200 200h-100z" />
<glyph glyph-name="8d" unicode="&#xe08d;"
d="M100 800h600v-300h100l-150 -250l-150 250h100v200h-400v-100h-100v200zM150 550l150 -250h-100v-200h400v100h100v-200h-600v300h-100z" />
<glyph glyph-name="8e" unicode="&#xe08e;"
d="M600 700l200 -150l-200 -150v100h-500v-100h-100v100c0 55 45 100 100 100h500v100zM200 300v-100h500v100h100v-100c0 -55 -45 -100 -100 -100h-500v-100l-200 150z" />
<glyph glyph-name="8f" unicode="&#xe08f;" horiz-adv-x="900"
d="M350 800c193 0 350 -157 350 -350c0 -60 -17 -117 -44 -166c5 -3 12 -8 16 -12l100 -100c16 -16 30 -49 30 -72c0 -56 -46 -102 -102 -102c-23 0 -56 14 -72 30l-100 100c-4 3 -9 9 -12 13c-49 -26 -107 -41 -166 -41c-193 0 -350 157 -350 350s157 350 350 350zM350 200
c142 0 250 108 250 250c0 139 -111 250 -250 250s-250 -111 -250 -250s111 -250 250 -250z" />
<glyph glyph-name="90" unicode="&#xe090;" horiz-adv-x="600"
d="M300 800c166 0 300 -134 300 -300c0 -200 -300 -500 -300 -500s-300 300 -300 500c0 166 134 300 300 300zM300 700c-110 0 -200 -90 -200 -200s90 -200 200 -200s200 90 200 200s-90 200 -200 200z" />
<glyph glyph-name="91" unicode="&#xe091;" horiz-adv-x="900"
d="M0 800h800v-541c1 -3 1 -8 1 -11s0 -7 -1 -10v-238h-800v800zM495 250c0 26 22 50 50 50h5h150v400h-600v-600h600v100h-150h-5c-28 0 -50 22 -50 50zM350 600c83 0 150 -67 150 -150c0 -100 -150 -250 -150 -250s-150 150 -150 250c0 83 67 150 150 150zM350 500
c-28 0 -50 -22 -50 -50s22 -50 50 -50s50 22 50 50s-22 50 -50 50z" />
<glyph glyph-name="92" unicode="&#xe092;" horiz-adv-x="600"
d="M0 700h200v-600h-200v600zM400 700h200v-600h-200v600z" />
<glyph glyph-name="93" unicode="&#xe093;" horiz-adv-x="600"
d="M0 700l600 -300l-600 -300v600z" />
<glyph glyph-name="94" unicode="&#xe094;" horiz-adv-x="600"
d="M300 700c166 0 300 -134 300 -300s-134 -300 -300 -300s-300 134 -300 300s134 300 300 300z" />
<glyph glyph-name="95" unicode="&#xe095;"
d="M400 700v-600l-400 300zM400 400l400 300v-600z" />
<glyph glyph-name="96" unicode="&#xe096;"
d="M0 700l400 -300l-400 -300v600zM400 100v600l400 -300z" />
<glyph glyph-name="97" unicode="&#xe097;"
d="M0 700h200v-600h-200v600zM200 400l500 300v-600z" />
<glyph glyph-name="98" unicode="&#xe098;"
d="M0 700l500 -300l-500 -300v600zM500 100v600h200v-600h-200z" />
<glyph glyph-name="99" unicode="&#xe099;" horiz-adv-x="600"
d="M0 700h600v-600h-600v600z" />
<glyph glyph-name="9a" unicode="&#xe09a;"
d="M200 800h400v-200h200v-400h-200v-200h-400v200h-200v400h200v200z" />
<glyph glyph-name="9b" unicode="&#xe09b;"
d="M0 700h800v-100h-800v100zM0 403h800v-100h-800v100zM0 103h800v-100h-800v100z" />
<glyph glyph-name="9c" unicode="&#xe09c;" horiz-adv-x="600"
d="M278 700c7 2 13 4 22 4c55 0 100 -45 100 -100v-4v-200c0 -55 -45 -100 -100 -100s-100 45 -100 100v200v2c0 44 35 88 78 98zM34 500h4h3c3 0 6 1 9 1c28 0 50 -22 50 -50v-1v-50c0 -111 89 -200 200 -200s200 89 200 200v50c0 28 22 50 50 50s50 -22 50 -50v-50
c0 -148 -109 -270 -250 -294v-106h50c55 0 100 -45 100 -100h-400c0 55 45 100 100 100h50v106c-141 24 -250 146 -250 294v50v2c0 20 15 42 34 48z" />
<glyph glyph-name="9d" unicode="&#xe09d;"
d="M0 500h800v-200h-800v200z" />
<glyph glyph-name="9e" unicode="&#xe09e;"
d="M34 700h4h3h4h5h700c28 0 50 -22 50 -50v-500c0 -28 -22 -50 -50 -50h-250v-100h100c55 0 100 -45 100 -100h-600c0 55 45 100 100 100h100v100h-250c-28 0 -50 22 -50 50v500v2c0 20 15 42 34 48zM100 600v-400h600v400h-600z" />
<glyph glyph-name="9f" unicode="&#xe09f;"
d="M272 700c-14 -40 -22 -83 -22 -128c0 -221 179 -400 400 -400c45 0 88 8 128 22c-53 -158 -202 -272 -378 -272c-221 0 -400 179 -400 400c0 176 114 325 272 378z" />
<glyph glyph-name="a0" unicode="&#xe0a0;"
d="M350 700l150 -150h-100v-150h150v100l150 -150l-150 -150v100h-150v-150h100l-150 -150l-150 150h100v150h-150v-100l-150 150l150 150v-100h150v150h-100z" />
<glyph glyph-name="a1" unicode="&#xe0a1;"
d="M800 800v-550c0 -83 -67 -150 -150 -150s-150 67 -150 150s67 150 150 150c17 0 35 -4 50 -9v206c-201 -6 -327 -27 -400 -50v-397c0 -83 -67 -150 -150 -150s-150 67 -150 150s67 150 150 150c17 0 35 -4 50 -9v409s100 100 600 100z" />
<glyph glyph-name="a2" unicode="&#xe0a2;" horiz-adv-x="700"
d="M499 700c51 0 102 -20 141 -59c78 -78 78 -203 0 -281l-250 -244c-48 -48 -127 -48 -175 0s-48 127 0 175l96 97l69 -69l-90 -94l-7 -3c-10 -10 -10 -28 0 -38s28 -10 38 0l250 247c37 40 39 102 0 141s-104 40 -144 0l-278 -275c-66 -69 -68 -179 0 -247
c69 -69 181 -69 250 0l9 12l116 113l69 -69l-125 -125c-107 -107 -281 -107 -388 0s-107 281 0 388l278 272c39 39 90 59 141 59z" />
<glyph glyph-name="a3" unicode="&#xe0a3;"
d="M600 800l200 -200l-100 -100l-200 200zM400 600l200 -200l-400 -400h-200v200z" />
<glyph glyph-name="a4" unicode="&#xe0a4;"
d="M550 800c83 0 150 -90 150 -200s-67 -200 -150 -200c-22 0 -40 8 -59 19c6 26 9 52 9 81c0 84 -27 158 -72 212c27 52 71 88 122 88zM250 700c83 0 150 -90 150 -200s-67 -200 -150 -200s-150 90 -150 200s67 200 150 200zM725 384c44 -22 75 -66 75 -118v-166h-200v66
c0 50 -17 96 -44 134c66 2 126 33 169 84zM75 284c45 -53 106 -84 175 -84s130 31 175 84c44 -22 75 -66 75 -118v-166h-500v166c0 52 31 96 75 118z" />
<glyph glyph-name="a5" unicode="&#xe0a5;"
d="M400 800c110 0 200 -112 200 -250s-90 -250 -200 -250s-200 112 -200 250s90 250 200 250zM191 300c54 -61 128 -100 209 -100s155 39 209 100c106 -5 191 -92 191 -200v-100h-800v100c0 108 85 195 191 200z" />
<glyph glyph-name="a6" unicode="&#xe0a6;" horiz-adv-x="600"
d="M19 800h462c11 0 19 -8 19 -19v-762c0 -11 -8 -19 -19 -19h-462c-11 0 -19 8 -19 19v762c0 11 8 19 19 19zM100 700v-500h300v500h-300zM250 150c-28 0 -50 -22 -50 -50s22 -50 50 -50s50 22 50 50s-22 50 -50 50z" />
<glyph glyph-name="a7" unicode="&#xe0a7;"
d="M350 800c17 0 34 -1 50 -3v-397l-297 297c63 64 150 103 247 103zM500 694c169 -25 300 -168 300 -344c0 -193 -157 -350 -350 -350c-85 0 -161 31 -222 81l272 272v341zM91 562l237 -234l-212 -212c-70 55 -116 138 -116 234c0 84 35 158 91 212z" />
<glyph glyph-name="a8" unicode="&#xe0a8;"
d="M92 650c0 23 20 50 46 50h3h4h5h400c28 0 50 -22 50 -50s-22 -50 -50 -50h-50v-200h100c55 0 100 -45 100 -100h-300v-300l-56 -100l-44 100v300h-300c0 55 45 100 100 100h100v200h-50c-2 0 -6 -1 -8 -1c-28 0 -50 23 -50 51z" />
<glyph glyph-name="a9" unicode="&#xe0a9;"
d="M400 800c221 0 400 -179 400 -400s-179 -400 -400 -400s-400 179 -400 400s179 400 400 400zM300 600v-400l300 200z" />
<glyph glyph-name="aa" unicode="&#xe0aa;"
d="M300 800h200v-300h300v-200h-300v-300h-200v300h-300v200h300v300z" />
<glyph glyph-name="ab" unicode="&#xe0ab;"
d="M300 800h100v-400h-100v400zM172 656l62 -78l-40 -31c-58 -46 -94 -117 -94 -197c0 -139 111 -250 250 -250s250 111 250 250c0 80 -39 151 -97 197l-37 31l62 78l38 -31c82 -64 134 -164 134 -275c0 -193 -157 -350 -350 -350s-350 157 -350 350c0 111 53 211 134 275z
" />
<glyph glyph-name="ac" unicode="&#xe0ac;"
d="M200 800h400v-200h-400v200zM9 500h782c6 0 9 -3 9 -9v-282c0 -6 -3 -9 -9 -9h-91v200h-600v-200h-91c-6 0 -9 3 -9 9v282c0 6 3 9 9 9zM200 300h400v-300h-400v300z" />
<glyph glyph-name="ad" unicode="&#xe0ad;"
d="M0 700h100v-700h-100v700zM700 700h100v-700h-100v700zM200 600h200v-100h-200v100zM300 400h200v-100h-200v100zM400 200h200v-100h-200v100z" />
<glyph glyph-name="ae" unicode="&#xe0ae;"
d="M325 700c42 -141 87 -280 131 -419c29 74 59 148 88 222c30 -57 58 -114 87 -172h169v-100h-231l-13 28c-37 -92 -74 -184 -112 -275c-38 129 -79 257 -119 385c-42 -133 -83 -267 -125 -400c-28 88 -56 175 -84 262h-116v100h188l9 -34l3 -6c42 137 83 273 125 409z" />
<glyph glyph-name="af" unicode="&#xe0af;"
d="M200 600c0 57 43 100 100 100s100 -43 100 -100c0 -28 -18 -48 -28 -72c-3 -6 -3 -16 -3 -28h231v-231c12 0 22 0 28 3c24 10 44 28 72 28c57 0 100 -43 100 -100s-43 -100 -100 -100c-28 0 -48 18 -72 28c-6 3 -16 3 -28 3v-231h-231c0 12 0 22 3 28c10 24 28 44 28 72
c0 57 -43 100 -100 100s-100 -43 -100 -100c0 -28 18 -48 28 -72c3 -6 3 -16 3 -28h-231v600h231c0 12 0 22 -3 28c-10 24 -28 44 -28 72z" />
<glyph glyph-name="b0" unicode="&#xe0b0;" horiz-adv-x="500"
d="M247 700c84 0 148 -20 191 -59s59 -93 59 -141c0 -117 -69 -181 -119 -225s-81 -67 -81 -150v-25h-100v25c0 117 65 181 115 225s85 67 85 150c0 25 -8 48 -28 66s-56 34 -122 34s-97 -18 -116 -37s-27 -43 -31 -69l-100 12c5 38 19 88 59 128s103 66 188 66zM197 0h100
v-100h-100v100z" />
<glyph glyph-name="b1" unicode="&#xe0b1;"
d="M450 800c138 0 250 -112 250 -250v-50c58 -21 100 -85 100 -150c0 -69 -48 -127 -112 -144c-22 55 -75 94 -138 94c-20 0 -39 -5 -56 -12c-17 64 -75 112 -144 112s-127 -48 -144 -112c-17 7 -36 12 -56 12c-37 0 -71 -12 -97 -34c-33 36 -53 82 -53 134
c0 110 90 200 200 200c23 114 129 200 250 200zM334 300h4h3c3 0 6 1 9 1c28 0 50 -22 50 -50v-1v-200c0 -28 -22 -50 -50 -50s-50 22 -50 50v200v2c0 20 15 42 34 48zM134 200h4h3c3 0 6 1 9 1c28 0 50 -22 50 -50v-1v-100c0 -28 -22 -50 -50 -50s-50 22 -50 50v100v2
c0 20 15 42 34 48zM534 200h3h4c3 0 6 1 9 1c28 0 50 -22 50 -50v-1v-100c0 -28 -22 -50 -50 -50s-50 22 -50 50v100v2c0 20 15 42 34 48z" />
<glyph glyph-name="b2" unicode="&#xe0b2;"
d="M600 800l200 -150l-200 -150v100h-50l-153 -191l175 -206l6 -3h22v100l200 -150l-200 -150v100h-25c-35 0 -56 12 -78 38l-166 190l-153 -190c-22 -27 -43 -38 -78 -38h-100v100h100l166 206l-163 191l-3 3h-100v100h100c34 0 56 -12 78 -38l153 -178l141 178
c22 27 43 38 78 38h50v100z" />
<glyph glyph-name="b3" unicode="&#xe0b3;"
d="M400 800c110 0 209 -47 281 -119l119 119v-300h-300l109 109c-54 55 -126 91 -209 91c-166 0 -300 -134 -300 -300s134 -300 300 -300c83 0 158 34 212 88l72 -72c-72 -72 -174 -116 -284 -116c-220 0 -400 180 -400 400s180 400 400 400z" />
<glyph glyph-name="b4" unicode="&#xe0b4;"
d="M400 800h400v-400l-166 166l-400 -400l166 -166h-400v400l166 -166l400 400z" />
<glyph glyph-name="b5" unicode="&#xe0b5;" horiz-adv-x="600"
d="M250 800l250 -300h-200v-200h200l-250 -300l-250 300h200v200h-200z" />
<glyph glyph-name="b6" unicode="&#xe0b6;"
d="M300 600v-200h200v200l300 -250l-300 -250v200h-200v-200l-300 250z" />
<glyph glyph-name="b7" unicode="&#xe0b7;"
d="M0 800c441 0 800 -359 800 -800h-200c0 333 -267 600 -600 600v200zM0 500c275 0 500 -225 500 -500h-200c0 167 -133 300 -300 300v200zM0 200c110 0 200 -90 200 -200h-200v200z" />
<glyph glyph-name="b8" unicode="&#xe0b8;"
d="M100 800c386 0 700 -314 700 -700h-100c0 332 -268 600 -600 600v100zM100 600c276 0 500 -224 500 -500h-100c0 222 -178 400 -400 400v100zM100 400c165 0 300 -135 300 -300h-100c0 111 -89 200 -200 200v100zM100 200c55 0 100 -45 100 -100s-45 -100 -100 -100
s-100 45 -100 100s45 100 100 100z" />
<glyph glyph-name="b9" unicode="&#xe0b9;"
d="M300 800h400c55 0 100 -45 100 -100v-200h-400v150c0 28 -22 50 -50 50s-50 -22 -50 -50v-250h400v-300c0 -55 -45 -100 -100 -100h-500c-55 0 -100 45 -100 100v200h100v-150c0 -28 22 -50 50 -50s50 22 50 50v550c0 55 45 100 100 100z" />
<glyph glyph-name="ba" unicode="&#xe0ba;"
d="M75 700h225v-100h-200v-500h400v100h100v-125c0 -41 -34 -75 -75 -75h-450c-41 0 -75 34 -75 75v550c0 41 34 75 75 75zM600 700l200 -200l-200 -200v100h-200c-94 0 -173 -65 -194 -153c23 199 189 353 394 353v100z" />
<glyph glyph-name="bb" unicode="&#xe0bb;"
d="M500 700l300 -284l-300 -316v200h-100c-200 0 -348 -102 -400 -300c0 295 100 500 500 500v200z" />
<glyph glyph-name="bc" unicode="&#xe0bc;"
d="M381 791l19 9l19 -9c127 -53 253 -108 381 -160v-31c0 -166 -67 -313 -147 -419c-40 -53 -83 -97 -125 -128s-82 -53 -128 -53s-86 22 -128 53s-85 75 -125 128c-80 107 -147 253 -147 419v31c128 52 254 107 381 160zM400 100v591l-294 -122c8 -126 58 -243 122 -328
c35 -46 73 -86 106 -110s62 -31 66 -31z" />
<glyph glyph-name="bd" unicode="&#xe0bd;"
d="M600 800h100v-800h-100v800zM400 700h100v-700h-100v700zM200 500h100v-500h-100v500zM0 300h100v-300h-100v300z" />
<glyph glyph-name="be" unicode="&#xe0be;"
d="M300 800h100v-200h200l100 -100l-100 -100h-200v-400h-100v500h-200l-100 100l100 100h200v100z" />
<glyph glyph-name="bf" unicode="&#xe0bf;"
d="M200 800h100v-600h200l-250 -200l-250 200h200v600zM400 800h200v-100h-200v100zM400 600h300v-100h-300v100zM400 400h400v-100h-400v100z" />
<glyph glyph-name="c0" unicode="&#xe0c0;"
d="M200 800h100v-600h200l-250 -200l-250 200h200v600zM400 800h400v-100h-400v100zM400 600h300v-100h-300v100zM400 400h200v-100h-200v100z" />
<glyph glyph-name="c1" unicode="&#xe0c1;"
d="M75 700h650c41 0 75 -34 75 -75v-550c0 -41 -34 -75 -75 -75h-650c-41 0 -75 34 -75 75v550c0 41 34 75 75 75zM100 600v-100h100v100h-100zM300 600v-100h400v100h-400zM100 400v-100h100v100h-100zM300 400v-100h400v100h-400zM100 200v-100h100v100h-100zM300 200
v-100h400v100h-400z" />
<glyph glyph-name="c2" unicode="&#xe0c2;"
d="M400 800l100 -300h300l-250 -200l100 -300l-250 200l-250 -200l100 300l-250 200h300z" />
<glyph glyph-name="c3" unicode="&#xe0c3;"
d="M400 800c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50zM150 700c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50zM650 700c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50zM400 600c110 0 200 -90 200 -200
s-90 -200 -200 -200s-200 90 -200 200s90 200 200 200zM50 450c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50zM750 450c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50zM150 200c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50
s22 50 50 50zM650 200c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50zM400 100c28 0 50 -22 50 -50s-22 -50 -50 -50s-50 22 -50 50s22 50 50 50z" />
<glyph glyph-name="c4" unicode="&#xe0c4;"
d="M34 800h632c18 0 34 -16 34 -34v-732c0 -18 -16 -34 -34 -34h-632c-18 0 -34 16 -34 34v732c0 18 16 34 34 34zM100 700v-500h500v500h-500zM350 150c-38 0 -63 -42 -44 -75s69 -33 88 0s-6 75 -44 75z" />
<glyph glyph-name="c5" unicode="&#xe0c5;"
d="M0 800h300l500 -500l-300 -300l-500 500v300zM200 700c-55 0 -100 -45 -100 -100s45 -100 100 -100s100 45 100 100s-45 100 -100 100z" />
<glyph glyph-name="c6" unicode="&#xe0c6;"
d="M0 600h200l300 -300l-200 -200l-300 300v200zM340 600h160l300 -300l-200 -200l-78 78l119 122zM150 500c-28 0 -50 -22 -50 -50s22 -50 50 -50s50 22 50 50s-22 50 -50 50z" />
<glyph glyph-name="c7" unicode="&#xe0c7;"
d="M400 800c220 0 400 -180 400 -400s-180 -400 -400 -400s-400 180 -400 400s180 400 400 400zM400 700c-166 0 -300 -134 -300 -300s134 -300 300 -300s300 134 300 300s-134 300 -300 300zM400 600c110 0 200 -90 200 -200s-90 -200 -200 -200s-200 90 -200 200
s90 200 200 200zM400 500c-56 0 -100 -44 -100 -100s44 -100 100 -100s100 44 100 100s-44 100 -100 100z" />
<glyph glyph-name="c8" unicode="&#xe0c8;"
d="M0 700h559l-100 -100h-359v-500h500v159l100 100v-359h-700v700zM700 700l100 -100l-400 -400l-200 200l100 100l100 -100z" />
<glyph glyph-name="c9" unicode="&#xe0c9;"
d="M9 800h782c6 0 9 -3 9 -9v-782c0 -6 -3 -9 -9 -9h-782c-6 0 -9 3 -9 9v782c0 6 3 9 9 9zM150 722l-72 -72l100 -100l-100 -100l72 -72l172 172zM400 500v-100h300v100h-300z" />
<glyph glyph-name="ca" unicode="&#xe0ca;"
d="M0 800h800v-200h-50c0 55 -45 100 -100 100h-150v-550c0 -28 22 -50 50 -50h50v-100h-400v100h50c28 0 50 22 50 50v550h-150c-55 0 -100 -45 -100 -100h-50v200z" />
<glyph glyph-name="cb" unicode="&#xe0cb;"
d="M0 700h100v-400h-100v400zM200 700h350c21 0 39 -13 47 -31c0 0 103 -291 103 -319s-22 -50 -50 -50h-150c-28 0 -50 -25 -50 -50s39 -158 47 -184s-5 -55 -31 -63s-52 5 -66 31s-109 219 -128 238s-44 28 -72 28v400z" />
<glyph glyph-name="cc" unicode="&#xe0cc;"
d="M400 666c10 19 28 32 47 34l19 -3c26 -8 39 -37 31 -63s-47 -159 -47 -184s22 -50 50 -50h150c28 0 50 -22 50 -50s-103 -319 -103 -319c-8 -18 -26 -31 -47 -31h-350v400c28 0 53 9 72 28s114 212 128 238zM0 400h100v-400h-100v400z" />
<glyph glyph-name="cd" unicode="&#xe0cd;"
d="M200 700h300v-100h-100v-6c25 -4 50 -8 72 -16l-34 -94c-28 11 -58 16 -88 16c-139 0 -250 -111 -250 -250s111 -250 250 -250s250 111 250 250c0 31 -5 60 -16 88l91 37c14 -38 25 -81 25 -125c0 -193 -157 -350 -350 -350s-350 157 -350 350c0 176 130 323 300 347v3
h-100v100zM700 584c0 0 -296 -348 -316 -368s-48 -20 -68 0s-20 48 0 68s384 300 384 300z" />
<glyph glyph-name="ce" unicode="&#xe0ce;"
d="M600 700l200 -150l-200 -150v100h-600v100h600v100zM200 300v-100h600v-100h-600v-100l-200 150z" />
<glyph glyph-name="cf" unicode="&#xe0cf;"
d="M300 800h100c55 0 100 -45 100 -100h100c55 0 100 -45 100 -100h-700c0 55 45 100 100 100h100c0 55 45 100 100 100zM100 500h100v-350c0 -28 22 -50 50 -50s50 22 50 50v350h100v-350c0 -28 22 -50 50 -50s50 22 50 50v350h100v-481c0 -11 -8 -19 -19 -19h-462
c-11 0 -19 8 -19 19v481z" />
<glyph glyph-name="d0" unicode="&#xe0d0;"
d="M100 800h200v-400c0 -55 45 -100 100 -100s100 45 100 100v400h100v-400c0 -110 -90 -200 -200 -200h-50c-138 0 -250 90 -250 200v400zM0 100h700v-100h-700v100z" />
<glyph glyph-name="d1" unicode="&#xe0d1;"
d="M9 700h182c6 0 9 -3 9 -9v-482c0 -6 -3 -9 -9 -9h-182c-6 0 -9 3 -9 9v482c0 6 3 9 9 9zM609 700h182c6 0 9 -3 9 -9v-482c0 -6 -3 -9 -9 -9h-182c-6 0 -9 3 -9 9v482c0 6 3 9 9 9zM309 500h182c6 0 9 -3 9 -9v-282c0 -6 -3 -9 -9 -9h-182c-6 0 -9 3 -9 9v282
c0 6 3 9 9 9zM0 100h800v-100h-800v100z" />
<glyph glyph-name="d2" unicode="&#xe0d2;"
d="M10 700h181c6 0 9 -3 9 -9v-191h-200v191c0 6 4 9 10 9zM610 700h181c6 0 9 -3 9 -9v-191h-200v191c0 6 5 9 10 9zM310 600h181c6 0 9 -3 9 -9v-91h-200v91c0 6 4 9 10 9zM0 400h800v-100h-800v100zM0 200h200v-191c0 -6 -3 -9 -9 -9h-182c-6 0 -9 3 -9 9v191zM300 200
h200v-91c0 -6 -3 -9 -9 -9h-181c-6 0 -10 3 -10 9v91zM600 200h200v-191c0 -6 -3 -9 -9 -9h-181c-6 0 -10 3 -10 9v191z" />
<glyph glyph-name="d3" unicode="&#xe0d3;"
d="M0 700h800v-100h-800v100zM9 500h182c6 0 9 -3 9 -9v-482c0 -6 -3 -9 -9 -9h-182c-6 0 -9 3 -9 9v482c0 6 3 9 9 9zM309 500h182c6 0 9 -3 9 -9v-282c0 -6 -3 -9 -9 -9h-182c-6 0 -9 3 -9 9v282c0 6 3 9 9 9zM609 500h182c6 0 9 -3 9 -9v-482c0 -6 -3 -9 -9 -9h-182
c-6 0 -9 3 -9 9v482c0 6 3 9 9 9z" />
<glyph glyph-name="d4" unicode="&#xe0d4;"
d="M50 600h500c28 0 50 -22 50 -50v-150l100 100h100v-300h-100l-100 100v-150c0 -28 -22 -50 -50 -50h-500c-28 0 -50 22 -50 50v400c0 28 22 50 50 50z" />
<glyph glyph-name="d5" unicode="&#xe0d5;"
d="M334 800h66v-800h-66l-134 200h-200v400h200zM500 600v100c26 0 52 -4 75 -10c130 -33 225 -150 225 -290s-95 -258 -225 -291h-3c-23 -6 -47 -9 -72 -9v100c17 0 34 2 50 6c86 22 150 100 150 194s-64 172 -150 194c-16 4 -33 6 -50 6zM500 500l25 -3
c44 -11 75 -51 75 -97s-32 -86 -75 -97l-25 -3v200z" />
<glyph glyph-name="d6" unicode="&#xe0d6;" horiz-adv-x="600"
d="M334 800h66v-800h-66l-134 200h-200v400h200zM500 500l25 -3c44 -11 75 -51 75 -97s-32 -86 -75 -97l-25 -3v200z" />
<glyph glyph-name="d7" unicode="&#xe0d7;" horiz-adv-x="400"
d="M334 800h66v-800h-66l-134 200h-200v400h200z" />
<glyph glyph-name="d8" unicode="&#xe0d8;"
d="M309 800h82c6 0 10 -4 12 -9l294 -682l3 -19v-81c0 -6 -3 -9 -9 -9h-682c-6 0 -9 3 -9 9v81l3 19l294 682c2 5 6 9 12 9zM300 500v-200h100v200h-100zM300 200v-100h100v100h-100z" />
<glyph glyph-name="d9" unicode="&#xe0d9;"
d="M375 800c138 0 269 -39 378 -109l-53 -82c-93 60 -205 91 -325 91c-119 0 -229 -32 -322 -91l-53 82c109 70 237 109 375 109zM375 500c78 0 154 -23 216 -62l-53 -85c-46 30 -104 47 -163 47c-60 0 -112 -17 -159 -47l-54 85c62 40 134 62 213 62zM375 200
c55 0 100 -45 100 -100s-45 -100 -100 -100s-100 45 -100 100s45 100 100 100z" />
<glyph glyph-name="da" unicode="&#xe0da;" horiz-adv-x="900"
d="M551 800c16 0 32 0 47 -3l-97 -97v-200h200l97 97c3 -15 3 -31 3 -47c0 -138 -112 -250 -250 -250c-32 0 -62 8 -90 19l-288 -291c-20 -20 -46 -28 -72 -28s-52 8 -72 28c-39 39 -39 105 0 144l291 287c-11 28 -19 59 -19 91c0 138 112 250 250 250zM101 150
c-28 0 -50 -22 -50 -50s22 -50 50 -50s50 22 50 50s-22 50 -50 50z" />
<glyph glyph-name="db" unicode="&#xe0db;"
d="M141 700c84 -84 169 -167 253 -250c82 83 167 165 247 250l143 -141l-253 -253c84 -82 167 -166 253 -247l-143 -143c-81 86 -165 169 -247 253l-253 -253l-141 143c85 80 167 164 250 247c-83 84 -166 169 -250 253z" />
<glyph glyph-name="dc" unicode="&#xe0dc;"
d="M0 800h100l231 -300h38l231 300h100l-225 -300h225v-100h-300v-100h300v-100h-300v-200h-100v200h-300v100h300v100h-300v100h225z" />
<glyph glyph-name="dd" unicode="&#xe0dd;" horiz-adv-x="900"
d="M350 800c193 0 350 -157 350 -350c0 -61 -17 -119 -44 -169c4 -2 10 -6 13 -9l103 -100c16 -16 30 -49 30 -72c0 -56 -46 -102 -102 -102c-23 0 -56 14 -72 30l-100 103c-3 3 -7 9 -9 13c-50 -28 -108 -44 -169 -44c-193 0 -350 157 -350 350s157 350 350 350zM350 700
c-139 0 -250 -111 -250 -250s111 -250 250 -250c62 0 119 23 163 60c7 11 19 25 31 31l3 3c34 43 53 97 53 156c0 139 -111 250 -250 250zM300 600h100v-100h100v-100h-100v-100h-100v100h-100v100h100v100z" />
<glyph glyph-name="de" unicode="&#xe0de;" horiz-adv-x="900"
d="M350 800c193 0 350 -157 350 -350c0 -61 -17 -119 -44 -169c4 -2 10 -6 13 -9l103 -100c16 -16 30 -49 30 -72c0 -56 -46 -102 -102 -102c-23 0 -56 14 -72 30l-100 103c-3 3 -7 9 -9 13c-50 -28 -108 -44 -169 -44c-193 0 -350 157 -350 350s157 350 350 350zM350 700
c-139 0 -250 -111 -250 -250s111 -250 250 -250c62 0 119 23 163 60c7 11 19 25 31 31l3 3c34 43 53 97 53 156c0 139 -111 250 -250 250zM200 500h300v-100h-300v100z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 54 KiB

View File

@ -0,0 +1,183 @@
@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
a, .btn-link {
color: #0366d6;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
#app {
position: relative;
display: flex;
flex-direction: column;
}
.top-row {
height: 3.5rem;
display: flex;
align-items: center;
}
.main {
flex: 1;
}
.main .top-row {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
}
.main .top-row > a, .main .top-row .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
}
.main .top-row a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.sidebar .top-row {
background-color: rgba(0,0,0,0.4);
}
.sidebar .navbar-brand {
font-size: 1.1rem;
}
.sidebar .oi {
width: 2rem;
font-size: 1.1rem;
vertical-align: text-top;
top: -2px;
}
.sidebar .nav-item {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.sidebar .nav-item:first-of-type {
padding-top: 1rem;
}
.sidebar .nav-item:last-of-type {
padding-bottom: 1rem;
}
.sidebar .nav-item a {
color: #d7d7d7;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
}
.sidebar .nav-item a.active {
background-color: rgba(255,255,255,0.25);
color: white;
}
.sidebar .nav-item a:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
.content {
padding-top: 1.1rem;
}
.navbar-toggler {
background-color: rgba(255, 255, 255, 0.1);
}
.valid.modified:not([type=checkbox]) {
outline: 1px solid #26b050;
}
.invalid {
outline: 1px solid red;
}
.validation-message {
color: red;
}
#blazor-error-ui {
background: lightyellow;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem 1.25rem;
position: fixed;
width: 100%;
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
@media (max-width: 767.98px) {
.main .top-row:not(.auth) {
display: none;
}
.main .top-row.auth {
justify-content: space-between;
}
.main .top-row a, .main .top-row .btn-link {
margin-left: 0;
}
}
@media (min-width: 768px) {
#app {
flex-direction: row;
}
.sidebar {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.main .top-row {
position: sticky;
top: 0;
}
.main > div {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
.navbar-toggler {
display: none;
}
.sidebar .collapse {
/* Never collapse the sidebar for wide screens */
display: block;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -0,0 +1,24 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>gRPC-Web in Blazor</title>
<base href="/" />
<link href="css/bootstrap/bootstrap.min.css" rel="stylesheet" />
<link href="css/site.css" rel="stylesheet" />
</head>
<body>
<div id="app">Loading...</div>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a href="" class="reload">Reload</a>
<a class="dismiss">🗙</a>
</div>
<script src="_framework/blazor.webassembly.js"></script>
</body>
</html>

View File

@ -0,0 +1,29 @@
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package count;
service Counter {
rpc StartCounter (CounterRequest) returns (stream CounterResponse);
}
message CounterRequest {
int32 start = 1;
}
message CounterResponse {
int32 count = 1;
}

View File

@ -0,0 +1,34 @@
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";
package weather;
service WeatherForecasts {
rpc GetWeatherForecasts (google.protobuf.Empty) returns (GetWeatherForecastsResponse);
}
message GetWeatherForecastsResponse {
repeated WeatherForecast forecasts = 1;
}
message WeatherForecast {
google.protobuf.Timestamp date = 1;
int32 temperatureC = 2;
string summary = 3;
}

View File

@ -0,0 +1,53 @@
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using Microsoft.AspNetCore.ResponseCompression;
using Server.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
builder.Services.AddResponseCompression(opts =>
{
opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "application/octet-stream" });
});
var app = builder.Build();
app.UseResponseCompression();
if (app.Environment.IsDevelopment())
{
app.UseWebAssemblyDebugging();
}
else
{
app.UseHsts();
}
app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseGrpcWeb();
app.MapGrpcService<WeatherService>().EnableGrpcWeb();
app.MapGrpcService<CounterService>().EnableGrpcWeb();
app.MapFallbackToFile("index.html");
app.Run();

View File

@ -0,0 +1,29 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:59193/",
"sslPort": 44375
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Server": {
"commandName": "Project",
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

View File

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<UserSecretsId>46982f83-f153-443e-b589-4b2bc7b5945e</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<Protobuf Include="..\Proto\weather.proto" GrpcServices="Server" Link="Protos\weather.proto" />
<Protobuf Include="..\Proto\count.proto" GrpcServices="Server" Link="Protos\count.proto" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" />
<PackageReference Include="Grpc.AspNetCore" />
<PackageReference Include="Grpc.AspNetCore.Web" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Client\Client.csproj" />
</ItemGroup>
</Project>

View File

@ -16,31 +16,28 @@
#endregion
using System;
using System.Threading.Tasks;
using Count;
using Grpc.Core;
namespace BenchmarkClient.ChannelFactory
namespace Server.Services
{
public class GrpcCoreChannelFactory : IChannelFactory
public class CounterService : Counter.CounterBase
{
private readonly string _target;
public GrpcCoreChannelFactory(string target)
public override async Task StartCounter(CounterRequest request, IServerStreamWriter<CounterResponse> responseStream, ServerCallContext context)
{
_target = target;
}
var count = request.Start;
public async Task<ChannelBase> CreateAsync()
{
var channel = new Channel(_target, ChannelCredentials.Insecure);
await channel.ConnectAsync();
while (!context.CancellationToken.IsCancellationRequested)
{
await responseStream.WriteAsync(new CounterResponse
{
Count = ++count
});
return channel;
}
public Task DisposeAsync(ChannelBase channel)
{
return ((Channel)channel).ShutdownAsync();
await Task.Delay(TimeSpan.FromSeconds(1));
}
}
}
}

View File

@ -0,0 +1,51 @@
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using System;
using System.Linq;
using System.Threading.Tasks;
using Google.Protobuf.WellKnownTypes;
using Grpc.Core;
using Weather;
namespace Server.Services
{
public class WeatherService : WeatherForecasts.WeatherForecastsBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
public override Task<GetWeatherForecastsResponse> GetWeatherForecasts(Empty request, ServerCallContext context)
{
var rng = new Random();
var results = Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.UtcNow.AddDays(index).ToTimestamp(),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
}).ToArray();
var response = new GetWeatherForecastsResponse();
response.Forecasts.AddRange(results);
return Task.FromResult(response);
}
}
}

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"AllowedHosts": "*"
}

View File

@ -0,0 +1,3 @@
<Solution>
<Project Path="Server/Server.csproj" />
</Solution>

View File

@ -0,0 +1,39 @@
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using Server.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseGrpcWeb();
app.MapGrpcService<GreeterService>().EnableGrpcWeb();
app.Run();

View File

@ -0,0 +1,44 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<SpaRoot>wwwroot\</SpaRoot>
<DefaultItemExcludes>$(DefaultItemExcludes);$(SpaRoot)node_modules\**;$(SpaRoot)dist\**</DefaultItemExcludes>
</PropertyGroup>
<ItemGroup>
<Protobuf Include="..\Proto\greet.proto" GrpcServices="Server" Link="Protos\greet.proto" />
<PackageReference Include="Grpc.AspNetCore" />
<PackageReference Include="Grpc.AspNetCore.Web" />
</ItemGroup>
<Target Name="DebugEnsureNodeEnv" BeforeTargets="Build" Condition=" '$(Configuration)' == 'Debug' And !Exists('$(SpaRoot)node_modules') ">
<!-- Ensure Node.js is installed -->
<Exec Command="node --version" ContinueOnError="true">
<Output TaskParameter="ExitCode" PropertyName="ErrorCode" />
</Exec>
<Error Condition="'$(ErrorCode)' != '0'" Text="Node.js is required to build and run this project. To continue, please install Node.js from https://nodejs.org/, and then restart your command prompt or IDE." />
<Message Importance="high" Text="Restoring dependencies using 'npm'. This may take several minutes..." />
<Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
<!-- Include source map for debugging (for other source map options see https://webpack.js.org/configuration/devtool/ ) -->
<Exec WorkingDirectory="$(SpaRoot)" Command="npx webpack --debug --devtool inline-source-map scripts/index.js" />
</Target>
<Target Name="PublishRunWebpack" AfterTargets="ComputeFilesToPublish">
<!-- As part of publishing, ensure the JS resources are freshly built in production mode -->
<Exec WorkingDirectory="$(SpaRoot)" Command="npm install" />
<Exec WorkingDirectory="$(SpaRoot)" Command="npx webpack scripts/index.js" />
<!-- Include the newly-built files in the publish output -->
<ItemGroup>
<DistFiles Include="$(SpaRoot)dist\**" />
<ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
<RelativePath>%(DistFiles.Identity)</RelativePath>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
</ResolvedFileToPublish>
</ItemGroup>
</Target>
</Project>

View File

@ -0,0 +1,44 @@
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using System;
using System.Threading.Tasks;
using Greet;
using Grpc.Core;
namespace Server.Services
{
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply { Message = $"Hello {request.Name}" });
}
public override async Task SayHellos(HelloRequest request, IServerStreamWriter<HelloReply> responseStream, ServerCallContext context)
{
var i = 0;
while (!context.CancellationToken.IsCancellationRequested)
{
await responseStream.WriteAsync(new HelloReply { Message = $"Hello {request.Name} {i}" });
await Task.Delay(TimeSpan.FromSeconds(1));
i++;
}
}
}
}

View File

@ -0,0 +1,10 @@
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Grpc": "Information",
"Microsoft": "Information"
}
}
}

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"AllowedHosts": "*"
}

View File

@ -0,0 +1,40 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
# compiled output
/dist
/dist-server
/tmp
/out-tsc
# dependencies
/node_modules
# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
# misc
/.sass-cache
/connect.lock
/coverage
/libpeerconnection.log
npm-debug.log
yarn-error.log
testem.log
/typings
# System Files
.DS_Store
Thumbs.db

View File

@ -0,0 +1,12 @@
# gRPC-Web generated client
gRPC-Web JavaScript clients and messages are generated using `protoc` the gRPC-Web code generator plugin. Instructions for using it are available [here](https://github.com/grpc/grpc-web#code-generator-plugin).
Files in this directory are generated from *greet.proto*:
* *greet_grpc_web_pb.js* contains the gRPC-Web client.
* *greet_pb.js* contains gRPC messages.
Example of using `protoc` from PowerShell (`protoc` and `protoc-gen-grpc-web` should be on your computer and discoverable from your PATH):
> protoc greet.proto --js_out=import_style=commonjs:CHANGE_TO_SCRIPTS_DIRECTORY --grpc-web_out=import_style=commonjs,mode=grpcwebtext:CHANGE_TO_SCRIPTS_DIRECTORY --plugin=protoc-gen-grpc-web=CHANGE_TO_PROTOC_GEN_GRPC_WEB_EXE_PATH

View File

@ -0,0 +1,225 @@
/**
* @fileoverview gRPC-Web generated client stub for greet
* @enhanceable
* @public
*/
// GENERATED CODE -- DO NOT EDIT!
const grpc = {};
grpc.web = require('grpc-web');
const proto = {};
proto.greet = require('./greet_pb.js');
/**
* @param {string} hostname
* @param {?Object} credentials
* @param {?Object} options
* @constructor
* @struct
* @final
*/
proto.greet.GreeterClient =
function(hostname, credentials, options) {
if (!options) options = {};
options['format'] = 'text';
/**
* @private @const {!grpc.web.GrpcWebClientBase} The client
*/
this.client_ = new grpc.web.GrpcWebClientBase(options);
/**
* @private @const {string} The hostname
*/
this.hostname_ = hostname;
};
/**
* @param {string} hostname
* @param {?Object} credentials
* @param {?Object} options
* @constructor
* @struct
* @final
*/
proto.greet.GreeterPromiseClient =
function(hostname, credentials, options) {
if (!options) options = {};
options['format'] = 'text';
/**
* @private @const {!grpc.web.GrpcWebClientBase} The client
*/
this.client_ = new grpc.web.GrpcWebClientBase(options);
/**
* @private @const {string} The hostname
*/
this.hostname_ = hostname;
};
/**
* @const
* @type {!grpc.web.MethodDescriptor<
* !proto.greet.HelloRequest,
* !proto.greet.HelloReply>}
*/
const methodDescriptor_Greeter_SayHello = new grpc.web.MethodDescriptor(
'/greet.Greeter/SayHello',
grpc.web.MethodType.UNARY,
proto.greet.HelloRequest,
proto.greet.HelloReply,
/**
* @param {!proto.greet.HelloRequest} request
* @return {!Uint8Array}
*/
function(request) {
return request.serializeBinary();
},
proto.greet.HelloReply.deserializeBinary
);
/**
* @const
* @type {!grpc.web.AbstractClientBase.MethodInfo<
* !proto.greet.HelloRequest,
* !proto.greet.HelloReply>}
*/
const methodInfo_Greeter_SayHello = new grpc.web.AbstractClientBase.MethodInfo(
proto.greet.HelloReply,
/**
* @param {!proto.greet.HelloRequest} request
* @return {!Uint8Array}
*/
function(request) {
return request.serializeBinary();
},
proto.greet.HelloReply.deserializeBinary
);
/**
* @param {!proto.greet.HelloRequest} request The
* request proto
* @param {?Object<string, string>} metadata User defined
* call metadata
* @param {function(?grpc.web.Error, ?proto.greet.HelloReply)}
* callback The callback function(error, response)
* @return {!grpc.web.ClientReadableStream<!proto.greet.HelloReply>|undefined}
* The XHR Node Readable Stream
*/
proto.greet.GreeterClient.prototype.sayHello =
function(request, metadata, callback) {
return this.client_.rpcCall(this.hostname_ +
'/greet.Greeter/SayHello',
request,
metadata || {},
methodDescriptor_Greeter_SayHello,
callback);
};
/**
* @param {!proto.greet.HelloRequest} request The
* request proto
* @param {?Object<string, string>} metadata User defined
* call metadata
* @return {!Promise<!proto.greet.HelloReply>}
* A native promise that resolves to the response
*/
proto.greet.GreeterPromiseClient.prototype.sayHello =
function(request, metadata) {
return this.client_.unaryCall(this.hostname_ +
'/greet.Greeter/SayHello',
request,
metadata || {},
methodDescriptor_Greeter_SayHello);
};
/**
* @const
* @type {!grpc.web.MethodDescriptor<
* !proto.greet.HelloRequest,
* !proto.greet.HelloReply>}
*/
const methodDescriptor_Greeter_SayHellos = new grpc.web.MethodDescriptor(
'/greet.Greeter/SayHellos',
grpc.web.MethodType.SERVER_STREAMING,
proto.greet.HelloRequest,
proto.greet.HelloReply,
/**
* @param {!proto.greet.HelloRequest} request
* @return {!Uint8Array}
*/
function(request) {
return request.serializeBinary();
},
proto.greet.HelloReply.deserializeBinary
);
/**
* @const
* @type {!grpc.web.AbstractClientBase.MethodInfo<
* !proto.greet.HelloRequest,
* !proto.greet.HelloReply>}
*/
const methodInfo_Greeter_SayHellos = new grpc.web.AbstractClientBase.MethodInfo(
proto.greet.HelloReply,
/**
* @param {!proto.greet.HelloRequest} request
* @return {!Uint8Array}
*/
function(request) {
return request.serializeBinary();
},
proto.greet.HelloReply.deserializeBinary
);
/**
* @param {!proto.greet.HelloRequest} request The request proto
* @param {?Object<string, string>} metadata User defined
* call metadata
* @return {!grpc.web.ClientReadableStream<!proto.greet.HelloReply>}
* The XHR Node Readable Stream
*/
proto.greet.GreeterClient.prototype.sayHellos =
function(request, metadata) {
return this.client_.serverStreaming(this.hostname_ +
'/greet.Greeter/SayHellos',
request,
metadata || {},
methodDescriptor_Greeter_SayHellos);
};
/**
* @param {!proto.greet.HelloRequest} request The request proto
* @param {?Object<string, string>} metadata User defined
* call metadata
* @return {!grpc.web.ClientReadableStream<!proto.greet.HelloReply>}
* The XHR Node Readable Stream
*/
proto.greet.GreeterPromiseClient.prototype.sayHellos =
function(request, metadata) {
return this.client_.serverStreaming(this.hostname_ +
'/greet.Greeter/SayHellos',
request,
metadata || {},
methodDescriptor_Greeter_SayHellos);
};
module.exports = proto.greet;

View File

@ -0,0 +1,319 @@
// source: greet.proto
/**
* @fileoverview
* @enhanceable
* @suppress {messageConventions} JS Compiler reports an error if a variable or
* field starts with 'MSG_' and isn't a translatable message.
* @public
*/
// GENERATED CODE -- DO NOT EDIT!
var jspb = require('google-protobuf');
var goog = jspb;
var global = Function('return this')();
goog.exportSymbol('proto.greet.HelloReply', null, global);
goog.exportSymbol('proto.greet.HelloRequest', null, global);
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.greet.HelloRequest = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.greet.HelloRequest, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.greet.HelloRequest.displayName = 'proto.greet.HelloRequest';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.greet.HelloReply = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.greet.HelloReply, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.greet.HelloReply.displayName = 'proto.greet.HelloReply';
}
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.greet.HelloRequest.prototype.toObject = function(opt_includeInstance) {
return proto.greet.HelloRequest.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.greet.HelloRequest} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.greet.HelloRequest.toObject = function(includeInstance, msg) {
var f, obj = {
name: jspb.Message.getFieldWithDefault(msg, 1, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.greet.HelloRequest}
*/
proto.greet.HelloRequest.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.greet.HelloRequest;
return proto.greet.HelloRequest.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.greet.HelloRequest} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.greet.HelloRequest}
*/
proto.greet.HelloRequest.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setName(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.greet.HelloRequest.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.greet.HelloRequest.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.greet.HelloRequest} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.greet.HelloRequest.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getName();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
};
/**
* optional string name = 1;
* @return {string}
*/
proto.greet.HelloRequest.prototype.getName = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.greet.HelloRequest} returns this
*/
proto.greet.HelloRequest.prototype.setName = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.greet.HelloReply.prototype.toObject = function(opt_includeInstance) {
return proto.greet.HelloReply.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.greet.HelloReply} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.greet.HelloReply.toObject = function(includeInstance, msg) {
var f, obj = {
message: jspb.Message.getFieldWithDefault(msg, 1, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.greet.HelloReply}
*/
proto.greet.HelloReply.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.greet.HelloReply;
return proto.greet.HelloReply.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.greet.HelloReply} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.greet.HelloReply}
*/
proto.greet.HelloReply.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setMessage(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.greet.HelloReply.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.greet.HelloReply.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.greet.HelloReply} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.greet.HelloReply.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getMessage();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
};
/**
* optional string message = 1;
* @return {string}
*/
proto.greet.HelloReply.prototype.getMessage = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.greet.HelloReply} returns this
*/
proto.greet.HelloReply.prototype.setMessage = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
goog.object.extend(exports, proto.greet);

View File

@ -0,0 +1,58 @@
const { HelloRequest, HelloReply } = require('./greet_pb.js');
const { GreeterClient } = require('./greet_grpc_web_pb.js');
var client = new GreeterClient(window.location.origin);
var nameInput = document.getElementById('name');
var sendInput = document.getElementById('send');
var streamInput = document.getElementById('stream');
var resultText = document.getElementById('result');
var streamingCall = null;
// Unary call
sendInput.onclick = function () {
var request = new HelloRequest();
request.setName(nameInput.value);
client.sayHello(request, {}, (err, response) => {
resultText.innerHTML = htmlEscape(response.getMessage());
});
};
// Server streaming call
streamInput.onclick = function () {
if (!streamingCall) {
sendInput.disabled = true;
streamInput.value = 'Stop server stream';
resultText.innerHTML = '';
var request = new HelloRequest();
request.setName(nameInput.value);
streamingCall = client.sayHellos(request, {});
streamingCall.on('data', (response) => {
resultText.innerHTML += htmlEscape(response.getMessage()) + '<br />';
});
streamingCall.on('status', (status) => {
if (status.code == 0) {
resultText.innerHTML += 'Done';
} else {
resultText.innerHTML += 'Error: ' + htmlEscape(status.details);
}
});
} else {
streamingCall.cancel();
streamingCall = null;
sendInput.disabled = false;
streamInput.value = 'Start server stream';
}
};
function htmlEscape(str) {
return String(str)
.replace(/&/g, '&amp;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,21 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>gRPC-Web ASP.NET Core example</title>
</head>
<body>
<h2>gRPC-Web ASP.NET Core example</h2>
<div>
<span>Hello:</span>
<input id="name" type="text" />
<input id="send" type="button" value="Send unary" />
<input id="stream" type="button" value="Start server stream" />
</div>
<div>
<p id="result"></p>
</div>
<script type="text/javascript" src="./dist/main.js"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,12 @@
{
"version": "1.0.0",
"name": "browser-server",
"private": true,
"devDependencies": {
"@grpc/proto-loader": "^0.3.0",
"google-protobuf": "^3.6.1",
"grpc-web": "^1.0.0",
"webpack": "^5.94.0",
"webpack-cli": "^5.0.1"
}
}

View File

@ -1,31 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29230.61
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Server\Server.csproj", "{534AC5F8-2DF2-40BD-87A5-B3D8310118C4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Client", "Client\Client.csproj", "{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{534AC5F8-2DF2-40BD-87A5-B3D8310118C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{534AC5F8-2DF2-40BD-87A5-B3D8310118C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{534AC5F8-2DF2-40BD-87A5-B3D8310118C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{534AC5F8-2DF2-40BD-87A5-B3D8310118C4}.Release|Any CPU.Build.0 = Release|Any CPU
{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Release|Any CPU.ActiveCfg = Release|Any CPU
{48A1D3BC-A14B-436A-8822-6DE2BEF8B747}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {D22B3129-3BFB-41FA-9FCE-E45EBEF8C2DD}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,4 @@
<Solution>
<Project Path="Client/Client.csproj" />
<Project Path="Server/Server.csproj" />
</Solution>

View File

@ -2,15 +2,15 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Protobuf Include="..\Proto\certify.proto" GrpcServices="Client" Link="Protos\certify.proto" />
<PackageReference Include="Google.Protobuf" Version="$(GoogleProtobufPackageVersion)" />
<PackageReference Include="Grpc.Net.Client" Version="$(GrpcDotNetPackageVersion)" />
<PackageReference Include="Grpc.Tools" Version="$(GrpcPackageVersion)" PrivateAssets="All" />
<PackageReference Include="Google.Protobuf" />
<PackageReference Include="Grpc.Net.Client" />
<PackageReference Include="Grpc.Tools" PrivateAssets="All" />
<None Update="Certs\client.pfx">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

View File

@ -16,79 +16,66 @@
#endregion
using System;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Certify;
using Google.Protobuf.WellKnownTypes;
using Grpc.Core;
using Grpc.Net.Client;
namespace Client
// The server will return 403 (Forbidden). The method requires a certificate
await CallCertificateInfo(includeClientCertificate: false);
// The server will return a successful gRPC response
await CallCertificateInfo(includeClientCertificate: true);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
static async Task CallCertificateInfo(bool includeClientCertificate)
{
public class Program
try
{
static async Task Main(string[] args)
Console.WriteLine($"Setting up HttpClient. Client has certificate: {includeClientCertificate}");
using var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
// The server will return 403 (Forbidden). The method requires a certificate
await CallCertificateInfo(includeClientCertificate: false);
HttpHandler = CreateHttpHandler(includeClientCertificate)
});
var client = new Certifier.CertifierClient(channel);
// The server will return a successful gRPC response
await CallCertificateInfo(includeClientCertificate: true);
Console.WriteLine("Sending gRPC call...");
var certificateInfo = await client.GetCertificateInfoAsync(new Empty());
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
private static async Task CallCertificateInfo(bool includeClientCertificate)
Console.WriteLine($"Server received client certificate: {certificateInfo.HasCertificate}");
if (certificateInfo.HasCertificate)
{
try
{
Console.WriteLine($"Setting up HttpClient. Client has certificate: {includeClientCertificate}");
var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
HttpClient = CreateHttpClient(includeClientCertificate)
});
var client = new Certifier.CertifierClient(channel);
Console.WriteLine("Sending gRPC call...");
var certificateInfo = await client.GetCertificateInfoAsync(new Empty());
Console.WriteLine($"Server received client certificate: {certificateInfo.HasCertificate}");
if (certificateInfo.HasCertificate)
{
Console.WriteLine($"Client certificate name: {certificateInfo.Name}");
}
}
catch (RpcException ex)
{
Console.WriteLine($"gRPC error from calling service: {ex.Status.Detail}");
}
catch
{
Console.WriteLine($"Unexpected error calling service.");
throw;
}
Console.WriteLine($"Client certificate name: {certificateInfo.Name}");
}
private static HttpClient CreateHttpClient(bool includeClientCertificate)
{
var handler = new HttpClientHandler();
if (includeClientCertificate)
{
// Load client certificate
var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
var certPath = Path.Combine(basePath!, "Certs", "client.pfx");
var clientCertificate = new X509Certificate2(certPath, "1111");
handler.ClientCertificates.Add(clientCertificate);
}
// Create client
return new HttpClient(handler);
}
}
catch (RpcException ex)
{
Console.WriteLine($"gRPC error from calling service: {ex.Status.Detail}");
}
catch
{
Console.WriteLine($"Unexpected error calling service.");
throw;
}
Console.WriteLine();
}
static HttpClientHandler CreateHttpHandler(bool includeClientCertificate)
{
var handler = new HttpClientHandler();
if (includeClientCertificate)
{
// Load client certificate
var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
var certPath = Path.Combine(basePath!, "Certs", "client.pfx");
var clientCertificate = X509CertificateLoader.LoadPkcs12FromFile(certPath, "1111");
handler.ClientCertificates.Add(clientCertificate);
}
return handler;
}

View File

@ -16,31 +16,36 @@
#endregion
using Microsoft.AspNetCore.Hosting;
using System.Security.Cryptography.X509Certificates;
using Microsoft.AspNetCore.Authentication.Certificate;
using Microsoft.AspNetCore.Server.Kestrel.Https;
using Microsoft.Extensions.Hosting;
using Server;
namespace Server
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(kestrelOptions =>
{
public class Program
kestrelOptions.ConfigureHttpsDefaults(httpsOptions =>
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
httpsOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
});
});
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(kestrelOptions =>
{
kestrelOptions.ConfigureHttpsDefaults(httpsOptions =>
{
httpsOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
});
});
webBuilder.UseStartup<Startup>();
});
}
}
builder.Services.AddGrpc();
builder.Services.AddAuthorization();
builder.Services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme)
.AddCertificate(options =>
{
// Not recommended in production environments. The example is using a self-signed test certificate.
options.RevocationMode = X509RevocationMode.NoCheck;
options.ChainTrustValidationMode = X509ChainTrustMode.CustomRootTrust;
options.AllowedCertificateTypes = CertificateTypes.All;
});
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapGrpcService<CertifierService>();
app.Run();

View File

@ -1,14 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Protobuf Include="..\Proto\certify.proto" GrpcServices="Server" Link="Protos\certify.proto" />
<PackageReference Include="Grpc.AspNetCore" Version="$(GrpcDotNetPackageVersion)" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Certificate" Version="$(MicrosoftAspNetCorePackageVersion)" />
<PackageReference Include="Grpc.AspNetCore" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Certificate" />
</ItemGroup>
</Project>

View File

@ -1,62 +0,0 @@
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using System.Security.Cryptography.X509Certificates;
using Microsoft.AspNetCore.Authentication.Certificate;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Server
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
services.AddAuthorization();
services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme)
.AddCertificate(options =>
{
// Not recommended in production environments. The example is using a self-signed test certificate.
options.RevocationMode = X509RevocationMode.NoCheck;
options.AllowedCertificateTypes = CertificateTypes.All;
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<CertifierService>();
});
}
}
}

View File

@ -0,0 +1,4 @@
<Solution>
<Project Path="Client/Client.csproj" />
<Project Path="Server/Server.csproj" />
</Solution>

View File

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Protobuf Include="..\Proto\data_channel.proto" GrpcServices="Client" Link="Protos\data_channel.proto" />
<PackageReference Include="Google.Protobuf" />
<PackageReference Include="Grpc.Net.Client" />
<PackageReference Include="Grpc.Tools" PrivateAssets="All" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,66 @@
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using System.Text;
using DataChannel;
using Google.Protobuf;
using Grpc.Core;
using Grpc.Net.Client;
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new DataChanneler.DataChannelerClient(channel);
await UploadDataAsync(client);
await DownloadResultsAsync(client);
Console.WriteLine("Shutting down");
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
static async Task UploadDataAsync(DataChanneler.DataChannelerClient client)
{
var call = client.UploadData();
var dataChunks = TestData.Chunk(5);
foreach (var chunk in dataChunks)
{
Console.WriteLine($"Uploading chunk: {chunk.Length} bytes");
await call.RequestStream.WriteAsync(new DataRequest { Value = ByteString.CopyFrom(chunk) });
}
await call.RequestStream.CompleteAsync();
var result = await call;
Console.WriteLine($"Total upload processed: {result.BytesProcessed} bytes");
}
static async Task DownloadResultsAsync(DataChanneler.DataChannelerClient client)
{
var call = client.DownloadResults(new DataRequest { Value = ByteString.CopyFrom(TestData) });
await foreach (var result in call.ResponseStream.ReadAllAsync())
{
Console.WriteLine($"Downloaded bytes processed result: {result.BytesProcessed}");
}
}
public partial class Program
{
private static readonly byte[] TestData = Encoding.UTF8.GetBytes("The quick brown fox jumped over the lazy dog.");
}

View File

@ -0,0 +1,30 @@
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
syntax = "proto3";
package data_channel;
service DataChanneler {
rpc UploadData (stream DataRequest) returns (DataResult);
rpc DownloadResults (DataRequest) returns (stream DataResult);
}
message DataRequest {
bytes value = 1;
}
message DataResult {
int32 bytes_processed = 1;
}

View File

@ -0,0 +1,27 @@
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using Server;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
var app = builder.Build();
app.MapGrpcService<DataChannelerService>();
app.Run();

View File

@ -0,0 +1,12 @@
{
"profiles": {
"Server": {
"commandName": "Project",
"launchBrowser": false,
"applicationUrl": "https://localhost:5001",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Protobuf Include="..\Proto\data_channel.proto" GrpcServices="Server" Link="Protos\data_channel.proto" />
<PackageReference Include="Grpc.AspNetCore" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,107 @@
#region Copyright notice and license
// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#endregion
using System.Threading.Channels;
using DataChannel;
using Grpc.Core;
namespace Server
{
public class DataChannelerService : DataChanneler.DataChannelerBase
{
private readonly ILogger _logger;
public DataChannelerService(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<DataChannelerService>();
}
public override async Task<DataResult> UploadData(
IAsyncStreamReader<DataRequest> requestStream, ServerCallContext context)
{
var channel = Channel.CreateBounded<DataRequest>(new BoundedChannelOptions(capacity: 5)
{
SingleReader = false,
SingleWriter = true
});
var readTask = Task.Run(async () =>
{
await foreach (var message in requestStream.ReadAllAsync())
{
await channel.Writer.WriteAsync(message);
}
channel.Writer.Complete();
});
// Process incoming messages on three threads.
var bytesProcessedByThread = await Task.WhenAll(
ProcessMessagesAsync(channel.Reader, _logger),
ProcessMessagesAsync(channel.Reader, _logger),
ProcessMessagesAsync(channel.Reader, _logger));
await readTask;
return new DataResult { BytesProcessed = bytesProcessedByThread.Sum() };
static async Task<int> ProcessMessagesAsync(ChannelReader<DataRequest> reader, ILogger logger)
{
var total = 0;
await foreach (var message in reader.ReadAllAsync())
{
total += message.Value.Length;
}
return total;
}
}
public override async Task DownloadResults(DataRequest request,
IServerStreamWriter<DataResult> responseStream, ServerCallContext context)
{
var channel = Channel.CreateBounded<DataResult>(new BoundedChannelOptions(capacity: 5)
{
SingleReader = true,
SingleWriter = false
});
var consumerTask = Task.Run(async () =>
{
// Consume messages from channel and write to response stream.
await foreach (var message in channel.Reader.ReadAllAsync())
{
await responseStream.WriteAsync(message);
}
});
var dataChunks = request.Value.Chunk(size: 10);
// Write messages to channel from multiple threads.
await Task.WhenAll(dataChunks.Select(
async c =>
{
var message = new DataResult { BytesProcessed = c.Length };
await channel.Writer.WriteAsync(message);
}));
// Complete writing and wait for consumer to complete.
channel.Writer.Complete();
await consumerTask;
}
}
}

View File

@ -0,0 +1,10 @@
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Grpc": "Information",
"Microsoft": "Information"
}
}
}

View File

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" />
<PackageReference Include="Grpc.Net.Client" />
</ItemGroup>
</Project>

Some files were not shown because too many files have changed in this diff Show More