C # рдФрд░ C #: REST, gRPC рдФрд░ рдмреАрдЪ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз

C # рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ C # рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИрдВ, рдЕрдиреНрдп рдирд╣реАрдВ рд╣реИрдВред рдХреБрдЫ рдмрд╣реБрдд рддреЗрдЬ рд╣реИрдВ, рдЕрдиреНрдп рдирд╣реАрдВред рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рддрд╛рдХрд┐ рдЖрдк рддрдп рдХрд░ рд╕рдХреЗрдВ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХреМрди рд╕рд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдЖрдЬ рддрдХ рдХреА рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рддрдХрдиреАрдХреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдирдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо REST, gRPC рдФрд░ рдмреАрдЪ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдЗрд╖реНрдЯрддрдо рдкрд░рд┐рджреГрд╢реНрдп


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рд╕рдВрдЪрд╛рд░ рдХреЛ рдХреИрд╕реЗ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред рдореИрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ:

// on client side
public void Foo()
{
    var server = new MyServer(new Uri("https://www.myserver.com/");)
    int sum = server.Calculator.SumNumbers(12,13); 
}

// on server side
class CalculatorController : Controller{
    public int SumNumbers(int a, int b)
    {
        return a + b;
    }
}

рдореБрдЭреЗ рдкреВрд░рд╛ рдЗрдВрдЯреЗрд▓реАрдЬреЗрдВрд╕ рд╕рдкреЛрд░реНрдЯ рдЪрд╛рд╣рд┐рдПред рдЬрдм рдореИрдВ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рд╕рд░реНрд╡рд░ рдФрд░ ред рдореИрдВ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдФрд░ рдЬрдм рдореИрдВ рдХреИрд▓рдХреНрдпреВрд▓реЗрдЯрд░ рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ ред рдореИрдВ рд╕рднреА рдПрдХреНрд╢рди рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдЙрдЪреНрдЪрддрдо рдкреНрд░рджрд░реНрд╢рди, рдмрд╣реБрдд рдХрдо рдиреЗрдЯрд╡рд░реНрдХ рд▓реЛрдб рдФрд░ рджреНрд╡рд┐рджрд┐рд╢ рдбреЗрдЯрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдг рднреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдФрд░ рдореБрдЭреЗ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд░рдгрд╛рд▓реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдореБрдХрд╛рдмрд▓рд╛ рдХрд░рддреА рд╣реИ рддрд╛рдХрд┐ рдореИрдВ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдФрд░ рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рддреИрдирд╛рдд рдХрд░ рд╕рдХреВрдВред

рдпрд╣ рддреЛ рдЬреНрдпрд╛рджрд╛ рд╣реИ?

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рдпрд╣рд╛рдБ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдПрдкреАрдЖрдИ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ ред рдпрд╣ рдПрдХ рд╕реА # рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ:

  • рдХреЗрд╡рд▓ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рд╡рд░реНрдЧред
  • POCO рдХреНрд▓рд╛рд╕реЗрд╕ рдЬрд┐рд╕рдореЗрдВ рдлрд╝реАрд▓реНрдб рдФрд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЖрджрд┐рдо рдпрд╛ рдЕрдиреНрдп POCO рдХреНрд▓рд╛рд╕ рд╣реИред

рдПрдкреАрдЖрдИ рдореЗрдВ рд░рд╛рдЬреНрдп рд╣реЛрдиреЗ рд╕реЗ рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рднреА рдмреБрд░рд╛рдИ рдХреА рдЬрдбрд╝ рд╣реИред рддреЛ, рдЗрд╕ рд▓реЗрдЦ рдХреА рдЦрд╛рддрд┐рд░, рдЪрд▓реЛ рдЪреАрдЬреЛрдВ рдХреЛ рд╕реБрдВрджрд░ рдФрд░ рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВред

рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реАрд╕реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг


REST API 2000 рдХреЗ рджрд╢рдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╡рд┐рдЬрдп рдкреНрд░рд╛рдкреНрдд рдХреАред рдЕрдм рдпрд╣ рд╡реЗрдм рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рддрд░реАрдХрд╛ рд╣реИред

REST рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП GET , POST , PUT рдФрд░ DELETE рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ ред рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдкреЗрд▓реЛрдб (рдЖрдорддреМрд░ рдкрд░ JSON) рдпреБрдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИред рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдпрд╛ рд╕реНрд╡рдпрдВ рдПрдХ рдкреЗрд▓реЛрдб (рдЖрдорддреМрд░ рдкрд░ JSON) рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдпрд╣ рдПрдХ POST рдпрд╛ PUT рдЕрдиреБрд░реЛрдз рд╣реЛрддрд╛ рд╣реИред

рдПрдХ RESTful API рдорд╛рдирдХ рд╣реИ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ):

  • GET рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • PUT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╕рдВрд╕рд╛рдзрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • POST рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рд╕реЛрд░реНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рд╕рдВрд╕рд╛рдзрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЕрднреА рддрдХ REST рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЙрдкрд░реЛрдХреНрдд рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╢рд╛рдпрдж рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред .NET рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд REST рд╕рдорд░реНрдерди рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, ASP.NET рд╡реЗрдм API рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ REST рд╡реЗрдм рд╕реЗрд╡рд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ ASP.NET рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

рд╕рд░реНрд╡рд░ рдкрд░:

[Route("People")]
public class PeopleController : Controller
{
    [HttpGet]
    public Person GetPersonById(int id)
    {
        Person person = _db.GetPerson(id);
        return person;//Automatically serialized to JSON
    }
} 

рдЧреНрд░рд╛рд╣рдХ рдкрд░:

var client = new HttpClient();
string resultJson = await client.GetStringAsync("https://www.myserver.com/People/GetPersonById?id=123");
Person person = JsonConvert.DeserializeObject<Person>(resultJson);

REST рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╖реНрдЯрддрдо рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рддреЛ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдорд░рдореНрдордд


рд░реЗрдлрд╝рд┐рдЯ REST рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ REST рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╕рд░реНрд╡рд░ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдПрдХ рд╕рд░рд▓ рд╡рд┐рдзрд┐ рдереЗред рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕рд╛рдЭрд╛ рдХрд░рдХреЗ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдХреА рддрд░рдл, рдЖрдкрдХрд╛ рдХрдВрдЯреНрд░реЛрд▓рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛:

public interface IMyEmployeeApi
{
    [Get("/employee/{id}")]
    Task<Employee> GetEmployee(string id);
}

рдлрд┐рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдУрд░ рд╕реЗ рдЖрдкрдХреЛ рдЙрд╕реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:


var api = RestService.For<IMyEmployeeApi>("https://www.myserver.com");
var employee = await api.GetEmployee("abc");

рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдиреВрдЧреЗрдЯ рдкреИрдХреЗрдЬ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬрдЯрд┐рд▓ рд╕реНрд╡рдЪрд╛рд▓рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдпрд╛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдЗрд╖реНрдЯрддрдо рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реЛ рд░рд╣рд╛ рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ IntelliSense рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдЕрдиреБрдмрдВрдз рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИред

рдЕрдХрдбрд╝


рд░реЗрдлрд╝рд┐рдЯ рдХреА рддрд░рд╣, рд╕реНрд╡реИрдЧрд░ рднреА REST рдХреЗ рдКрдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред OpenAPI , рдпрд╛ рд╕реНрд╡реИрдЧрд░ , рдПрдХ REST API рд╡рд┐рдирд┐рд░реНрджреЗрд╢рди рд╣реИред рдпрд╣ рд╕рд╛рдзрд╛рд░рдг JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ REST рд╡реЗрдм рд╕реЗрд╡рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдпреЗ рдлрд╛рдЗрд▓реЗрдВ рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рдПрдкреАрдЖрдИ рд╕реНрдХреАрдорд╛ рд╣реИрдВред рдЙрдирдореЗ рд╢рд╛рдорд┐рд▓ рд╣реИ:

  • рдПрдкреАрдЖрдИ рдореЗрдВ рд╕рднреА рдкрде (рдпреВрдЖрд░рдПрд▓)ред
  • рдкреНрд░рддреНрдпреЗрдХ рдкрде рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди (GET, POST, ...)ред рдкреНрд░рддреНрдпреЗрдХ рдкрде рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рдорд┐рд╕реНрдЯреНрд░реАред рдкреНрд░реЛрдбрдХреНрдЯ рдПрдХ рдкреЛрд╕реНрдЯ рдСрдкрд░реЗрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЙрддреНрдкрд╛рдж рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЬреАрдИрдЯреА рдСрдкрд░реЗрд╢рди рдЬреЛ рдПрдХ рдЙрддреНрдкрд╛рдж рд▓реМрдЯрд╛рддрд╛ рд╣реИред
  • рдкреНрд░рддреНрдпреЗрдХ рдкрде рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ред
  • рдкреНрд░рддреНрдпреЗрдХ рдкрде рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рдЙрддреНрддрд░ред
  • рдкреНрд░рддреНрдпреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ред

рдпрд╣ JSON рдлрд╛рдЗрд▓ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдиреБрдмрдВрдз рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реНрд╡реИрдЧрд░ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рд╕реНрд╡реИрдЧрд░ рдкреЗрдЯрд╕реНрдЯреЛрд░ рдирд╛рдордХ рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ (рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреБрдЫ рднрд╛рдЧреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ):

Json рд╕реНрдХреАрдорд╛
{ 
   "swagger":"2.0",
   "info":{ 
      "version":"1.0.0",
      "title":"Swagger Petstore",
      "description":"A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification",
   },
   "host":"petstore.swagger.io",
   "basePath":"/api",
   "schemes":[ 
      "http"
   ],
   "consumes":[ 
      "application/json"
   ],
   "produces":[ 
      "application/json"
   ],
   "paths":{ 
      "/pets":{ 
         "get":{ 
            "description":"Returns all pets from the system that the user has access to",
            "operationId":"findPets",
            "produces":[ 
               "application/json",
               "application/xml",
            ],
            "parameters":[ 
               { 
                  "name":"tags",
                  "in":"query",
                  "description":"tags to filter by",
                  "required":false,
                  "type":"array",
                  "items":{ 
                     "type":"string"
                  },
                  "collectionFormat":"csv"
               },
               { 
                  "name":"limit",
                  "in":"query",
                  "description":"maximum number of results to return",
                  "required":false,
                  "type":"integer",
                  "format":"int32"
               }
            ],
            "responses":{ 
               "200":{ 
                  "description":"pet response",
                  "schema":{ 
                     "type":"array",
                     "items":{ 
                        "$ref":"#/definitions/Pet"
                     }
                  }
               },
...
 


рдЖрдЗрдП рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦреЗрдВред JSON рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЬреИрд╕реЗ рдХрд┐ рдЖрдк рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреВрд░реНрдг IntelliSense рдХреЗ рд╕рд╛рде C # рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдЖрдк рд╕рднреА рд░рд╛рд╕реНрддреЛрдВ, рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХрд┐рд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЙрддреНрддрд░ рдХреНрдпрд╛ рд╣реИрдВред

рдХрдИ рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬреЛ рдмрд╕ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рд╕рд░реНрд╡рд░ рдХреА рддрд░рдл, рдЖрдк рдЕрдкрдиреЗ ASP.NET рдореЗрдВ рд╕реНрд╡реИрдЧрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП Swashbuckle.AspNetCore рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ JSON рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реИрдЧрд░-рдХреЛрдбрдЧреЗрди рдФрд░ рдСрдЯреЛрд░реЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ:

рдЕрдкрдиреЗ ASP.NET рд╕рд░реНрд╡рд░ рдореЗрдВ рд╕реНрд╡реИрдЧрд░ рдЬреЛрдбрд╝рдирд╛


NuGet Swashbuckle.AspNetCore рдкреИрдХреЗрдЬ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ ред рдореЗрдВ ConfigureServices , рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реНрд╡реИрдЧрд░ рдЬрдирд░реЗрдЯрд░:

services.AddSwaggerGen(options => 
	options.SwaggerDoc("v1", new OpenApiInfo {Title = "My Web API", Version = "v1"}));

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╡рд┐рдзрд┐ рдореЗрдВ Startup.cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдЬреЛрдбрд╝реЗрдВ:

app.UseSwagger();

рдЕрдВрдд рдореЗрдВ, рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдЕрдВрджрд░ рдХреЗ рдПрдХреНрд╢рди рддрд░реАрдХреЛрдВ рдХреЛ [HttpXXX] рдФрд░ [FromXXX] рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП :

[HttpPost]
public async Task AddEmployee([FromBody]Employee employee)
{
    //...
}
 
[HttpGet]
public async Task<Employee> Employee([FromQuery]string id)
{
    //...
}

рдпрд╣ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИред рдЬрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ , рддреЛ рдПрдХ swagger.json рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рдПрдЧреА , рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

AutoRest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡реИрдЧрд░ рд╕реЗ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдирд╛


рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ AutoRest , рд╕рд╛рде рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд NPM : рдЬреА autorest рд╕реНрдерд╛рдкрд┐рдд NPM ред рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ Swagger.json рдлрд╝рд╛рдЗрд▓ рд╕реЗ C # рдХреНрд▓рд╛рдЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП AutoRest рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

autorest --input-file="./swagger.json" --output-folder="GeneratedClient" --namespace="MyClient" --override-client-name="MyClient" --csharp

рдпрд╣ рдЙрддреНрдкрдиреНрди C # рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ GeneratedClient рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдЧрд╛ ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирд╛рдо рд╕реНрдерд╛рди рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдирд╛рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ



рдЖрдкрдХреЛ Microsoft.Rest.ClientRuntime NuGet рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ , рдХреНрдпреЛрдВрдХрд┐ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рдмрд╛рдж, рдЖрдк API рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рдпрдорд┐рдд C # рд╡рд░реНрдЧ рдХреА рддрд░рд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

var client = new MyClient();
Employee employee = client.Employee(id: "abc");

рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдСрдЯреЛрд░реЗрд╕реНрдЯ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ ред рдФрд░ рдЖрдкрдХреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкреИрдЯреНрд░рд┐рдХ рд╕реНрд╡реЗрдиреНрд╕рди рдХреЗ рдореИрдиреБрдЕрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ , рд╕рд╛рде рд╣реА рд╕рд╛рде рдкреАрдЯрд░ рдпрд╛рдЙрд╕рд╡рд┐рдЯреНрд╕ рдХрд╛ рдпрд╣ рд▓реЗрдЦ ред

рд╕реНрд╡реИрдЧрд░ рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ JSON рдлрд╝рд╛рдЗрд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдмрдирд╛рдИ рдЧрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ CI рдпрд╛ CD рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реАрд╕реНрдЯ рдмрдирд╛рдо рд╕реНрд╡реИрдЧрд░ рдмрдирд╛рдо рд░реАрдлрд┐рдЯ


рдЪреБрдирдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдХреБрдЫ рдмрд┐рдВрджреБ рджрд┐рдП рдЧрдП рд╣реИрдВред

  • рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдирд┐рдЬреА REST API рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреАрдврд╝реА рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдп рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреЛ рдЙрдЪрд┐рдд рдирд╣реАрдВ рдард╣рд░рд╛рддрд╛ рд╣реИред
  • рд╕реНрд╡реИрдЧрд░ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд░реАрдлрд┐рдЯ рдХреЗрд╡рд▓ .NET рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕реНрд╡реИрдЧрд░ рдХрдИ рдЯреВрд▓реНрд╕, рдЯреЗрд╕реНрдЯ, рдСрдЯреЛрдореЗрд╢рди рдЯреВрд▓реНрд╕ рдФрд░ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдЯреВрд▓реНрд╕ рдХрд╛ рднреА рдЖрдзрд╛рд░ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдмрдбрд╝реА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ред
  • рд╕реНрд╡реИрдЧрд░ рд░реЗрдлрд╝рд┐рдЯ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред ReFit рдХреЗ рд╕рд╛рде, рдпрд╣ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЬреЛрдбрд╝рдиреЗ рдХреА рдмрд╛рдд рд╣реИред рджреВрд╕рд░реА рдУрд░, рд░реАрдлрд┐рдЯ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдирдП рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗ, рдЬрдмрдХрд┐ рд╕реНрд╡реИрдЧрд░ рдЗрд╕ рдмрд╛рдд рдХрд╛ рд╕реНрд╡рдд: рдзреНрдпрд╛рди рд░рдЦреЗрдЧрд╛ред

рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдХреБрдЫ рддрдп рдХрд░реЗрдВ, 4 рд╡реЗрдВ рд╡рд┐рдХрд▓реНрдк рдХреЛ рджреЗрдЦреЗрдВ, рдЬрд┐рд╕рдХрд╛ рдЖрд░рдИрдПрд╕рдЯреА рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред

gRPC


gRPC (gRPC - Remote Procedure Call) Google рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ рд╕рд┐рд╕реНрдЯрдо рд╣реИред рдпрд╣ REST рдЬреИрд╕рд╛ рдХреБрдЫ рд╣реИ рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИ, рдпрд╣рд╛рдВ рд╕рдорд╛рдирддрд╛рдПрдВ рдФрд░ рдЕрдВрддрд░ рд╣реИрдВ:

  • REST рдХреА рддрд░рд╣, gRPC рднрд╛рд╖рд╛ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИред C # рд╕рд╣рд┐рдд рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рд╣реИрдВред
  • gRPC рдЕрдиреБрдмрдВрдз рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЕрдиреБрдмрдВрдз рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП .proto рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ред рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ Swagger swagger.json рдФрд░ рд╕рд╛рдорд╛рдиреНрдп ReFit рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рдХреНрд▓рд╛рдЗрдВрдЯ рдЬреЗрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • gRPC Protocol Buffer (Protobuf). REST, JSON XML. , , .
  • gRPC HTTP/2. . , REST HTTP 1.x ( HTTP 1.1).
  • HTTP 1.1 TCP- () , HTTP/2 .
  • HTTP/2 . , TCP- . , , HTTP 1.1.
  • gRPC .

GRPC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВред .NET рдХреЛрд░ 3.0 рдХреЗ рд▓рд┐рдП, .NET рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд gRPC рд╣реИ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЖрдк рдЬреАрдЖрд░рдкреАрд╕реА рд╕реА # рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ .NET рдХреЗ рд▓рд┐рдП gRPC, gRPC C # рдХреА рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИ ред рдЪрд▓рд┐рдП .NET рдХреЗ рд▓рд┐рдП рдирдП gRPC рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВ ред

.NET рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдХреЗ рд▓рд┐рдП GRPC


рдпрд╣ рдПрдХ рдЧрд╛рдЗрдб рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдПред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд┐рдпрдВрддреНрд░рдХ gRPC рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:


public class GreeterService : Greeter.GreeterBase
{
    public override Task<HelloReply> SayHello(HelloRequest request,
        ServerCallContext context)
    {
        _logger.LogInformation("Saying hello to {Name}", request.Name);
        return Task.FromResult(new HelloReply 
        {
            Message = "Hello " + request.Name
        });
    }
}

рдЖрдкрдХреЛ Start..cs рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :


app.UseEndpoints(endpoints =>
{
    endpoints.MapGrpcService<GreeterService>();
});

API .proto рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ , рдЬреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ:

syntax = "proto3";
 
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}
 
message HelloRequest {
  string name = 1;
}
 
message HelloReply {
  string message = 1;
}

рдпрд╣ .proto рдлрд╝рд╛рдЗрд▓ .csproj рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ:

<ItemGroup>
  <Protobuf Include="Protos\greet.proto"/>
</ItemGroup>

.NET рдХреНрд▓рд╛рдЗрдВрдЯ рдкрдХреНрд╖ рдХреЗ рд▓рд┐рдП GRPC


рдХреНрд▓рд╛рдЗрдВрдЯ .proto рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ ред рдХреЛрдб рд╣реА рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:


var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
 
var response = await client.SayHello(
    new HelloRequest { Name = "World" });
 
Console.WriteLine(response.Message);

gRPC рдмрдирд╛рдо REST


рдЬреАрдЖрд░рдкреАрд╕реА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕реМрджрд╛ рд▓рдЧрддрд╛ рд╣реИред рдпрд╣ рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рддреЗрдЬ рдФрд░ рдЖрд╕рд╛рди рд╣реИред рддреЛ рдХреНрдпрд╛ рд╣рдо рд╕рднреА рдХреЛ REST рд╕реЗ gRPC рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЬрд╡рд╛рдм рд╣реИ рдХрд┐ рдпрд╣ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ред рдпрд╣рд╛рдБ рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рджрд┐рдП рдЧрдП рд╣реИрдВ:

рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ, gRPC рдФрд░ ASP.NET рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрднреА рднреА рдЫреЛрдЯрд╛ рд╣реИред рдЖрдк рдкрд░рд┐рдкрдХреНрд╡ рд░реАрд╕реНрдЯ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рд╣реЛрдВрдЧреЗред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдЕрдиреБрдмрдВрдз рд╕рдВрдЪрд╛рд░ рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ REST рдореЗрдВ рд╕рдорд╛рди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдмрд╛рдд рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ: рд╕реНрд╡реИрдЧрд░ рдФрд░ рд░реАрдлрд┐рдЯред

рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдлрд╛рдпрджрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЗрди рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ , рдЬреАрдЖрд░рдкреАрд╕реА рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ рдкреЗрд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдХреНрд░рдорд┐рдХрддрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдЪреНрдЪ рд▓реЛрдб рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реИред

рдПрдХ рдмрдбрд╝реЗ ASP.NET рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ REST рд╕реЗ gRPC рдореЗрдВ рдЬрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдорд╛рдЗрдХреНрд░реЛ-рд╕рд░реНрд╡рд┐рд╕-рдЖрдзрд╛рд░рд┐рдд рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрдХреНрд░рдордг рдзреАрд░реЗ-рдзреАрд░реЗ рдкреВрд░рд╛ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рд╕рдВрдЪрд╛рд░ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ


рд╕рдВрдЪрд╛рд░ рдХреЗ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд╛рдирдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВ:

  • рдЧреНрд░рд╛рдлрдХреЙрдХ рдлреЗрд╕рдмреБрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдПрдкреАрдЖрдИ рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рд╣реИред рдпрд╣ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рд╕рд░реНрд╡рд░ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдмреЗрд╣рдж рд▓рдЪреАрд▓рд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХреЗрд╡рд▓ рдЙрд╕реА рдбреЗрдЯрд╛ рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЧреНрд░рд╛рдлрдХреЙрд▓ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рдЧрдпрд╛ рд╣реИред
  • TcpClient TcpListener ( System.Net.Sockets) TCP. , . , ASP.NET API.
  • UdpClient UDP. TCP , UDP . TCP , , UDP тАФ . UDP , , . : , IP (VoIP).
  • WCF рдПрдХ рдкреБрд░рд╛рдиреА рддрдХрдиреАрдХ рд╣реИ рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ SOAP- рдЖрдзрд╛рд░рд┐рдд рдЕрдВрддрд░-рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдврд╛рдВрдЪрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЬрд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдиреЗ REST рдФрд░ JSON рдкреЗрд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдЦреЛ рджреА рд╣реИред

рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд▓реЗрдЦ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛! рд╕рднреА рдХреЛ рдЕрдЪреНрдЫрд╛ рдХреЛрдб!

All Articles