рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЛ " ASP.NET рдХреЛрд░ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреАрдЖрдИ рдЧреЗрдЯрд╡реЗ рдмрдирд╛рдирд╛ " рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред
рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП 10 рдорд┐рдирдЯ
рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, .NET рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлрд╝реНрдЯ рдХреЗ рд▓рд┐рдП JWT рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рди , рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдорд╛рдЗрдХреНрд░реЛрд╕реИрд╕ рд╕рд░реНрд╡рд┐рд╕ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рджреЗрдЦрд╛ред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрддреНрдкрд╛рдж рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдХ рдПрдХ рдПрдкреАрдЖрдИ рдЧреЗрдЯрд╡реЗ рд╣реИ - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдмреИрдХрдПрдВрдб рдХреЗ рдмреАрдЪ рдХреА рдПрдХ рдкреНрд░рдгрд╛рд▓реА, рдЬреЛ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдЗрдХреНрд░реЛрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд░реВрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рддрд╛ рд╣реИред
рдРрд╕реЗ рдХрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреАрдЖрдИ рдЧреЗрдЯрд╡реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╡рд╛ рдореЗрдВ .NET рдХреЛрд░ рдпрд╛ рдиреЗрдЯрдлреНрд▓рд┐рдХреНрд╕ рдЬрд╝реВрд▓ рдореЗрдВ рдУрд╕реЗрд▓реЙрдЯред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ .NET рдХреЛрд░ рдореЗрдВ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдкреАрдЖрдИ рдЧреЗрдЯрд╡реЗ рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдВрдбреЛ рдореЗрдВ ASP.NET рдХреЛрд░ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЦрд╛рд▓реА рдХрд░реЗрдВ ред


рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╡рд░реНрдЧ рдХрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдЖрдиреЗ рд╡рд╛рд▓реЗ HTTP рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реЛрдЧрд╛:
app.Run(async (context) => { await context.Response.WriteAsync("Hello, World!"); });
рд░рд╛рдЙрдЯрд░ рд╡рд░реНрддрдиреА
рдЪреВрдВрдХрд┐ рдпрд╣ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реИ рдХрд┐ рд╣рдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗ, рд╣рдо рдЖрд╡рд╢реНрдпрдХ рддрд░реНрдХ рд▓рд┐рдЦреЗрдВрдЧреЗ:
Router router = new Router("routes.json"); app.Run(async (context) => { var content = await router.RouteRequest(context.Request); await context.Response.WriteAsync(await content.Content.ReadAsStringAsync()); });
рдкрд╣рд▓реЗ рд╣рдо рд░рд╛рдЙрдЯрд░ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдореМрдЬреВрджрд╛ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛, рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛ рдФрд░ рднреЗрдЬрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдХреЛрдб рдХреЛ рдХреНрд▓реАрдирд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо JSON рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдВрдЧреЗред
рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрди рддрд░реНрдХ рд╣реИ: рдЧреЗрдЯрд╡реЗ рдкрд░ рдЕрдиреБрд░реЛрдз рдЖрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд░рд╛рдЙрдЯрд░ рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдЗрдХреНрд░реЛ рд╕рд░реНрд╡рд┐рд╕ рдкрд░ рднреЗрдЬ рджреЗрдЧрд╛ред
рд░рд╛рдЙрдЯрд░ рд╡рд░реНрдЧ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ path.json рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо рдорд╛рд░реНрдЧреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдПрдХ рдмрд╛рд╣рд░реА рдкрддрд╛ (рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ) рдФрд░ рдПрдХ рдЧрдВрддрд╡реНрдп рдкрддрд╛ (рдЧрдВрддрд╡реНрдп) рд╣реЛрдЧрд╛ред рд╕рд╛рде рд╣реА, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реБрдП рдПрдХ рдзреНрд╡рдЬ рдЬреЛрдбрд╝реЗрдВрдЧреЗред
рдпрд╣рд╛рдБ рдлрд╝рд╛рдЗрд▓ рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:
{ "routes": [ { "endpoint": "/movies", "destination": { "uri": "http://localhost:8090/movies/", "requiresAuthentication": "true" } }, { "endpoint": "/songs", "destination": { "uri": "http://localhost:8091/songs/", "requiresAuthentication": "false" } } ], "authenticationService": { "uri": "http://localhost:8080/api/auth/" } }
рдПрдХ рдЧрдВрддрд╡реНрдп рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ
рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░реВрдЯ рдХрд╛ endpoint
рдФрд░ рдЧрдВрддрд╡реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЧрдВрддрд╡реНрдп рдХреЗ рдкрд╛рд╕ uri
рдФрд░ requiresAuthentication
рд╣реЛрдиреА requiresAuthentication
ред
рдЕрдм рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрд╕реНрдЯрд┐рдиреЗрд╢рди рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдореИрдВ рджреЛ рдХреНрд╖реЗрддреНрд░реЛрдВ, рджреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдФрд░ рдПрдХ рдирд┐рдЬреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ JSON рдбрд┐рд╕реЗрд░рд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЬреЛрдбрд╝реВрдВрдЧрд╛ред
public class Destination { public string Uri { get; set; } public bool RequiresAuthentication { get; set; } public Destination(string uri, bool requiresAuthentication) { Uri = path; RequiresAuthentication = requiresAuthentication; } public Destination(string uri) :this(uri, false) { } private Destination() { Uri = "/"; RequiresAuthentication = false; } }
рд╕рд╛рде рд╣реА, рдЗрд╕ рдХрдХреНрд╖рд╛ рдореЗрдВ SendRequest
рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдирд╛ рд╕рд╣реА рд╣реЛрдЧрд╛ред рдпрд╣ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдВрддрд╡реНрдп рд╡рд░реНрдЧ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред рдпрд╣ рд╡рд┐рдзрд┐ HttpRequest
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрдЧреА, рдЬреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рд╡рд╣рд╛рдВ рд╕реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЛ рд▓рдХреНрд╖реНрдп URI рдХреЛ рднреЗрдЬрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ CreateDestinationUri
рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкрддреЗ рдФрд░ рдПрдбреНрд░реЗрд╕ рд▓рд╛рдЗрди (рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
private string CreateDestinationUri(HttpRequest request) { string requestPath = request.Path.ToString(); string queryString = request.QueryString.ToString(); string endpoint = ""; string[] endpointSplit = requestPath.Substring(1).Split('/'); if (endpointSplit.Length > 1) endpoint = endpointSplit[1]; return Uri + endpoint + queryString; }
рдЕрдм рд╣рдо рдПрдХ SendRequest
рд╡рд┐рдзрд┐ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ microservice рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдЧрд╛ рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ред
public async Task<HttpResponseMessage> SendRequest(HttpRequest request) { string requestContent; using (Stream receiveStream = request.Body) { using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8)) { requestContent = readStream.ReadToEnd(); } } HttpClient client = new HttpClient(); HttpRequestMessage newRequest = new HttpRequestMessage(new HttpMethod(request.Method), CreateDestinationUri(request)); HttpResponseMessage response = await client.SendAsync(newRequest); return response; }
рдПрдХ JSON рдкрд╛рд░реНрд╕рд░ рдмрдирд╛рдПрдВред
рд░рд╛рдЙрдЯрд░ рд╡рд░реНрдЧ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде JSON рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд┐рд╕реНрдХреНрд░рд╛рдЗрдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдмрдирд╛рдКрдВрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реЛрдВрдЧреА: рдПрдХ JSON рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ рдбреАрд╕рд░реНрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдПред
public class JsonLoader { public static T LoadFromFile<T>(string filePath) { using (StreamReader reader = new StreamReader(filePath)) { string json = reader.ReadToEnd(); T result = JsonConvert.DeserializeObject<T>(json); return result; } } public static T Deserialize<T>(object jsonObject) { return JsonConvert.DeserializeObject<T>(Convert.ToString(jsonObject)); } }
рдХрдХреНрд╖рд╛ рд░рд╛рдЙрдЯрд░ред
рд░рд╛рдЙрдЯрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдЬреЛ рдЖрдЦрд┐рд░реА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рд╡рд╣ рдорд╛рд░реНрдЧ рдореЙрдбрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╣реИ:
public class Route { public string Endpoint { get; set; } public Destination Destination { get; set; } }
рдЕрдм рдЦреЗрддреЛрдВ рдФрд░ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд░рд╛рдЙрдЯрд░ рдХреНрд▓рд╛рд╕ рд▓рд┐рдЦреЗрдВред
public class Router { public List<Route> Routes { get; set; } public Destination AuthenticationService { get; set; } public Router(string routeConfigFilePath) { dynamic router = JsonLoader.LoadFromFile<dynamic>(routeConfigFilePath); Routes = JsonLoader.Deserialize<List<Route>>( Convert.ToString(router.routes) ); AuthenticationService = JsonLoader.Deserialize<Destination>( Convert.ToString(router.authenticationService) ); } }
рдореИрдВ JSON рд╕реЗ рдкрдврд╝рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдЧреБрдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рдЕрдм рд╕рдм рдХреБрдЫ рдПрдкреАрдЖрдИ рдЧреЗрдЯрд╡реЗ рдХреА рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ: рдорд╛рд░реНрдЧ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг, рдЬреЛ рдХрд┐ RouteRequest
рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реЛрдЧрд╛ред рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдз рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдмрд╛рд╣рд░реА рдкрддреЗ (рдмреЗрд╕ рдПрдВрдбрдкреЙрдЗрдВрдЯ) рдХреЗ рдЖрдзрд╛рд░ рднрд╛рдЧ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрддреЗ /movies/add
рдЖрдзрд╛рд░ /movies/
ред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рдорд╛рд░реНрдЧ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░реЗрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП ConstructErrorMessage рд╡рд░реНрдЧ рднреА рдмрдирд╛рдпрд╛ред
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирд┐рдореНрди рддрд░реАрдХреЗ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА: рд╣рдо рдЕрдиреБрд░реЛрдз рд╣реЗрдбрд░ рд╕реЗ рдЯреЛрдХрди рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрд░реЛрдз рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВред рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИ: рд╣реЗрдбрд░ рдореЗрдВ рдПрдХ рдЯреЛрдХрди рдЫреЛрдбрд╝ рджреЗрдВ, рдлрд┐рд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрд╡рд╛ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
public async Task<HttpResponseMessage> RouteRequest(HttpRequest request) { string path = request.Path.ToString(); string basePath = '/' + path.Split('/')[1]; Destination destination; try { destination = Routes.First(r => r.Endpoint.Equals(basePath)).Destination; } catch { return ConstructErrorMessage("The path could not be found."); } if (destination.RequiresAuthentication) { string token = request.Headers["token"]; request.Query.Append(new KeyValuePair<string, StringValues>("token", new StringValues(token))); HttpResponseMessage authResponse = await AuthenticationService.SendRequest(request); if (!authResponse.IsSuccessStatusCode) return ConstructErrorMessage("Authentication failed."); } return await destination.SendRequest(request); } private HttpResponseMessage ConstructErrorMessage(string error) { HttpResponseMessage errorMessage = new HttpResponseMessage { StatusCode = HttpStatusCode.NotFound, Content = new StringContent(error) }; return errorMessage; }
рдирд┐рд╖реНрдХрд░реНрд╖
рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдПрдкреАрдЖрдИ рдЧреЗрдЯрд╡реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдЪрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдореМрдЬреВрджрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдпрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд░реВрдЯрд┐рдВрдЧ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд╕рднреА рдХреЛрдб GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ ред