Skip to content

Commit 54fa142

Browse files
authored
Change examples to use WebApplication V4 (#1879)
1 parent 195e1c0 commit 54fa142

File tree

16 files changed

+296
-626
lines changed

16 files changed

+296
-626
lines changed

examples/Ticketer/Client/Program.cs

Lines changed: 83 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -16,113 +16,108 @@
1616

1717
#endregion
1818

19-
using System;
20-
using System.Net.Http;
21-
using System.Threading.Tasks;
2219
using System.Web;
2320
using Google.Protobuf.WellKnownTypes;
2421
using Grpc.Core;
2522
using Grpc.Net.Client;
2623
using Ticket;
2724

28-
namespace Client
29-
{
30-
public class Program
31-
{
32-
private const string Address = "https://localhost:5001";
25+
using var channel = GrpcChannel.ForAddress(Address);
26+
var client = new Ticketer.TicketerClient(channel);
3327

34-
static async Task Main(string[] args)
35-
{
36-
using var channel = GrpcChannel.ForAddress(Address);
37-
var client = new Ticketer.TicketerClient(channel);
28+
Console.WriteLine("gRPC Ticketer");
29+
Console.WriteLine();
30+
Console.WriteLine("Press a key:");
31+
Console.WriteLine("1: Get available tickets");
32+
Console.WriteLine("2: Purchase ticket");
33+
Console.WriteLine("3: Authenticate");
34+
Console.WriteLine("4: Exit");
35+
Console.WriteLine();
3836

39-
Console.WriteLine("gRPC Ticketer");
40-
Console.WriteLine();
41-
Console.WriteLine("Press a key:");
42-
Console.WriteLine("1: Get available tickets");
43-
Console.WriteLine("2: Purchase ticket");
44-
Console.WriteLine("3: Authenticate");
45-
Console.WriteLine("4: Exit");
46-
Console.WriteLine();
37+
string? token = null;
4738

48-
string? token = null;
39+
var exiting = false;
40+
while (!exiting)
41+
{
42+
var consoleKeyInfo = Console.ReadKey(intercept: true);
43+
switch (consoleKeyInfo.KeyChar)
44+
{
45+
case '1':
46+
await GetAvailableTickets(client);
47+
break;
48+
case '2':
49+
await PurchaseTicket(client, token);
50+
break;
51+
case '3':
52+
token = await Authenticate();
53+
break;
54+
case '4':
55+
exiting = true;
56+
break;
57+
}
58+
}
4959

50-
var exiting = false;
51-
while (!exiting)
52-
{
53-
var consoleKeyInfo = Console.ReadKey(intercept: true);
54-
switch (consoleKeyInfo.KeyChar)
55-
{
56-
case '1':
57-
await GetAvailableTickets(client);
58-
break;
59-
case '2':
60-
await PurchaseTicket(client, token);
61-
break;
62-
case '3':
63-
token = await Authenticate();
64-
break;
65-
case '4':
66-
exiting = true;
67-
break;
68-
}
69-
}
60+
Console.WriteLine("Exiting");
7061

71-
Console.WriteLine("Exiting");
72-
}
62+
static async Task<string> Authenticate()
63+
{
64+
Console.WriteLine($"Authenticating as {Environment.UserName}...");
65+
using var httpClient = new HttpClient();
66+
using var request = new HttpRequestMessage
67+
{
68+
RequestUri = new Uri($"{Address}/generateJwtToken?name={HttpUtility.UrlEncode(Environment.UserName)}"),
69+
Method = HttpMethod.Get,
70+
Version = new Version(2, 0)
71+
};
72+
using var tokenResponse = await httpClient.SendAsync(request);
73+
tokenResponse.EnsureSuccessStatusCode();
7374

74-
private static async Task<string> Authenticate()
75-
{
76-
Console.WriteLine($"Authenticating as {Environment.UserName}...");
77-
using var httpClient = new HttpClient();
78-
using var request = new HttpRequestMessage
79-
{
80-
RequestUri = new Uri($"{Address}/generateJwtToken?name={HttpUtility.UrlEncode(Environment.UserName)}"),
81-
Method = HttpMethod.Get,
82-
Version = new Version(2, 0)
83-
};
84-
using var tokenResponse = await httpClient.SendAsync(request);
85-
tokenResponse.EnsureSuccessStatusCode();
75+
var token = await tokenResponse.Content.ReadAsStringAsync();
76+
Console.WriteLine("Successfully authenticated.");
8677

87-
var token = await tokenResponse.Content.ReadAsStringAsync();
88-
Console.WriteLine("Successfully authenticated.");
78+
return token;
79+
}
8980

90-
return token;
81+
static async Task PurchaseTicket(Ticketer.TicketerClient client, string? token)
82+
{
83+
Console.WriteLine("Purchasing ticket...");
84+
try
85+
{
86+
Metadata? headers = null;
87+
if (token != null)
88+
{
89+
headers = new Metadata();
90+
headers.Add("Authorization", $"Bearer {token}");
9191
}
9292

93-
private static async Task PurchaseTicket(Ticketer.TicketerClient client, string? token)
93+
var response = await client.BuyTicketsAsync(new BuyTicketsRequest { Count = 1 }, headers);
94+
if (response.Success)
9495
{
95-
Console.WriteLine("Purchasing ticket...");
96-
try
97-
{
98-
Metadata? headers = null;
99-
if (token != null)
100-
{
101-
headers = new Metadata();
102-
headers.Add("Authorization", $"Bearer {token}");
103-
}
104-
105-
var response = await client.BuyTicketsAsync(new BuyTicketsRequest { Count = 1 }, headers);
106-
if (response.Success)
107-
{
108-
Console.WriteLine("Purchase successful.");
109-
}
110-
else
111-
{
112-
Console.WriteLine("Purchase failed. No tickets available.");
113-
}
114-
}
115-
catch (Exception ex)
116-
{
117-
Console.WriteLine("Error purchasing ticket." + Environment.NewLine + ex.ToString());
118-
}
96+
Console.WriteLine("Purchase successful.");
11997
}
120-
121-
private static async Task GetAvailableTickets(Ticketer.TicketerClient client)
98+
else
12299
{
123-
Console.WriteLine("Getting available ticket count...");
124-
var response = await client.GetAvailableTicketsAsync(new Empty());
125-
Console.WriteLine("Available ticket count: " + response.Count);
100+
Console.WriteLine("Purchase failed. No tickets available.");
126101
}
127102
}
103+
catch (RpcException ex)
104+
{
105+
Console.WriteLine($"Error purchasing ticket: {ex.Status.StatusCode}");
106+
}
107+
catch (Exception ex)
108+
{
109+
Console.WriteLine($"Error purchasing ticket.{Environment.NewLine}{ex.ToString()}");
110+
}
111+
}
112+
113+
static async Task GetAvailableTickets(Ticketer.TicketerClient client)
114+
{
115+
Console.WriteLine("Getting available ticket count...");
116+
var response = await client.GetAvailableTicketsAsync(new Empty());
117+
Console.WriteLine("Available ticket count: " + response.Count);
118+
}
119+
120+
public partial class Program
121+
{
122+
private const string Address = "https://localhost:5001";
128123
}

examples/Ticketer/Server/Program.cs

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,64 @@
1616

1717
#endregion
1818

19-
using Microsoft.AspNetCore.Hosting;
20-
using Microsoft.Extensions.Hosting;
19+
using System.IdentityModel.Tokens.Jwt;
20+
using System.Security.Claims;
21+
using Microsoft.AspNetCore.Authentication.JwtBearer;
22+
using Microsoft.IdentityModel.Tokens;
23+
using Server;
2124

22-
namespace Server
25+
var builder = WebApplication.CreateBuilder(args);
26+
builder.Services.AddGrpc();
27+
builder.Services.AddSingleton<TicketRepository>();
28+
29+
builder.Services.AddAuthorization(options =>
30+
{
31+
options.AddPolicy(JwtBearerDefaults.AuthenticationScheme, policy =>
32+
{
33+
policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
34+
policy.RequireClaim(ClaimTypes.Name);
35+
});
36+
});
37+
builder.Services.AddAuthentication()
38+
.AddJwtBearer(options =>
39+
{
40+
options.TokenValidationParameters =
41+
new TokenValidationParameters
42+
{
43+
ValidateAudience = false,
44+
ValidateIssuer = false,
45+
ValidateActor = false,
46+
ValidateLifetime = true,
47+
IssuerSigningKey = SecurityKey
48+
};
49+
});
50+
51+
var app = builder.Build();
52+
53+
app.MapGrpcService<TicketerService>();
54+
55+
app.MapGet("/generateJwtToken", context =>
2356
{
24-
public class Program
57+
return context.Response.WriteAsync(GenerateJwtToken(context.Request.Query["name"]!));
58+
});
59+
60+
app.Run();
61+
62+
static string GenerateJwtToken(string name)
63+
{
64+
if (string.IsNullOrEmpty(name))
2565
{
26-
public static void Main(string[] args)
27-
{
28-
CreateHostBuilder(args).Build().Run();
29-
}
30-
31-
public static IHostBuilder CreateHostBuilder(string[] args) =>
32-
Host.CreateDefaultBuilder(args)
33-
.ConfigureWebHostDefaults(webBuilder =>
34-
{
35-
webBuilder.UseStartup<Startup>();
36-
});
66+
throw new InvalidOperationException("Name is not specified.");
3767
}
68+
69+
var claims = new[] { new Claim(ClaimTypes.Name, name) };
70+
var credentials = new SigningCredentials(SecurityKey, SecurityAlgorithms.HmacSha256);
71+
var token = new JwtSecurityToken("ExampleServer", "ExampleClients", claims, expires: DateTime.Now.AddSeconds(60), signingCredentials: credentials);
72+
return JwtTokenHandler.WriteToken(token);
73+
}
74+
75+
public partial class Program
76+
{
77+
private static readonly JwtSecurityTokenHandler JwtTokenHandler = new JwtSecurityTokenHandler();
78+
private static readonly SymmetricSecurityKey SecurityKey = new SymmetricSecurityKey(Guid.NewGuid().ToByteArray());
3879
}

examples/Ticketer/Server/Startup.cs

Lines changed: 0 additions & 101 deletions
This file was deleted.

0 commit comments

Comments
 (0)