자습서: ASP.NET Core에서 gRPC 클라이언트 및 서버 만들기

이 자습서에서는 .NET Core gRPC 클라이언트와 ASP.NET Core gRPC 서버를 만드는 방법을 보여줍니다. 끝으로 gRPC Greeter 서비스와 통신하는 gRPC 클라이언트를 갖게 됩니다.

이 자습서에서는 다음을 수행합니다.

  • gRPC 서버를 만듭니다.
  • gRPC 클라이언트를 만듭니다.
  • gRPC Greeter 서비스를 사용하여 gRPC 클라이언트 테스트

필수 조건

gRPC 서비스 만들기

  • Visual Studio 2022를 시작하고 새 프로젝트를 선택합니다.
  • 새 프로젝트 만들기 대화 상자에서 gRPC를 검색합니다. ASP.NET Core gRPC 서비스를 선택하고 다음을 선택합니다.
  • 새 프로젝트 구성 대화 상자에서 프로젝트 이름으로 GrpcGreeter를 입력합니다. 코드를 복사하여 붙여넣을 때 네임스페이스가 일치하도록 프로젝트 이름을 GrpcGreeter로 지정해야 합니다.
  • 다음을 선택합니다.
  • 추가 정보 대화 상자에서 .NET 8.0(장기 지원)을 선택한 다음 만들기를 선택합니다.

서비스 실행

  • Ctrl+F5를 눌러 디버거 없이 실행합니다.

    프로젝트가 SSL을 사용하도록 아직 구성되지 않은 경우 Visual Studio에 다음 대화 상자가 표시됩니다.

    이 프로젝트는 SSL을 사용하도록 구성되었습니다. 브라우저에서 SSL 경고를 피하려면 IIS Express에서 생성한 자체 서명된 인증서를 신뢰하도록 선택할 수 있습니다. IIS Express SSL 인증서를 신뢰하시겠습니까?

    IIS Express SSL 인증서를 신뢰하는 경우 를 선택합니다.

    다음 대화 상자가 표시됩니다.

    보안 경고 대화 상자

    개발 인증서를 신뢰하는 데 동의하는 경우 를 선택합니다.

    Firefox 브라우저를 신뢰하는 방법에 대한 자세한 내용은 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 인증서 오류를 참조하세요.

    Visual Studio:

    • Kestrel 서버를 시작합니다.
    • 브라우저를 시작합니다.
    • http://localhost:7042와 같은 http://localhost:port로 이동합니다.
      • port: 앱에 임의로 할당된 포트 번호입니다.
      • localhost: 로컬 컴퓨터의 표준 호스트 이름입니다. Localhost는 로컬 컴퓨터의 웹 요청만 지원합니다.

로그는 https://localhost:<port>에서 수신 대기 중인 서비스를 보여 줍니다. 여기서 <port>Properties/launchSettings.json에서 프로젝트를 만들고 설정할 때 임의로 할당된 localhost 포트 번호입니다.

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

참고 항목

gRPC 템플릿은 TLS(전송 계층 보안)를 사용하도록 구성됩니다. gRPC 클라이언트는 HTTPS를 사용하여 서버를 호출해야 합니다. gRPC 서비스 localhost 포트 번호는 프로젝트를 만들고 설정할 때 gRPC 서비스 프로젝트의 Properties\launchSettings.json 파일에서 임의로 할당됩니다.

프로젝트 파일 검토

GrpcGreeter 프로젝트 파일:

  • Protos/greet.proto: Greeter gRPC를 정의하고 gRPC 서버 자산을 생성하는 데 사용됩니다. 자세한 내용은 gRPC 소개를 참조하세요.
  • Services 폴더: Greeter 서비스의 구현이 들어 있습니다.
  • appSettings.json: Kestrel이 사용하는 프로토콜과 같은 구성 데이터가 들어 있습니다. 자세한 내용은 ASP.NET Core의 구성을 참조하세요.
  • Program.cs다음을 포함합니다.

.NET 콘솔 앱에서 gRPC 클라이언트 만들기

  • Visual Studio의 두 번째 인스턴스를 열고 새 프로젝트를 선택합니다.
  • 새 프로젝트 만들기 대화 상자에서 콘솔 앱을 선택하고 다음을 선택합니다.
  • 프로젝트 이름 텍스트 상자에 GrpcGreeterClient를 입력하고 다음을 선택합니다.
  • 추가 정보 대화 상자에서 .NET 8.0(장기 지원)을 선택한 다음 만들기를 선택합니다.

필요한 NuGet 패키지 추가

gRPC 클라이언트 프로젝트에는 다음 NuGet 패키지가 필요합니다.

  • Grpc.Net.Client는 .NET Core 클라이언트를 포함합니다.
  • Google.Protobuf는 C#용 protobuf 메시지 API를 포함합니다.
  • Grpc.Tools는 protobuf 파일에 대한 C# 도구 지원을 포함합니다. 도구 패키지는 런타임에 필요하지 않으므로 종속성은 PrivateAssets="All"로 표시됩니다.

PMC(패키지 관리자 콘솔) 또는 NuGet 패키지 관리를 사용하여 패키지를 설치합니다.

PMC를 사용한 패키지 설치

  • Visual Studio에서 도구>NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

  • 패키지 관리자 콘솔 창에서 실행 cd GrpcGreeterClient 하여 파일을 포함하는 GrpcGreeterClient.csproj 폴더로 디렉터리를 변경합니다.

  • 다음 명령을 실행합니다.

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    

패키지 설치를 위한 NuGet 패키지 관리 옵션

  • 솔루션 탐색기>NuGet 패키지 관리에서 프로젝트를 마우스 오른쪽 단추로 클릭합니다.
  • 찾아보기 탭을 선택합니다.
  • 검색 상자에 Grpc.Net.Client를 입력합니다.
  • 찾아보기 탭에서 Grpc.Net.Client 패키지를 선택하고 설치를 선택합니다.
  • Google.ProtobufGrpc.Tools에 대해 반복합니다.

greet.proto 추가

  • gRPC 클라이언트 프로젝트에서 Protos 폴더를 만듭니다.

  • gRPC Greeter 서비스에서 Protos\greet.proto 파일을 gRPC 클라이언트 프로젝트의 Protos 폴더에 복사합니다.

  • greet.proto 파일 내의 네임스페이스를 프로젝트의 네임스페이스로 업데이트합니다.

    option csharp_namespace = "GrpcGreeterClient";
    
  • GrpcGreeterClient.csproj 프로젝트 파일을 편집합니다.

프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 파일 편집을 선택합니다.

  • greet.proto 파일을 참조하는 <Protobuf> 요소를 사용하여 항목 그룹을 추가합니다.

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

Greeter 클라이언트 만들기

  • 클라이언트 프로젝트를 빌드하여 GrpcGreeterClient 네임스페이스에 형식을 만듭니다.

참고 항목

GrpcGreeterClient 형식은 빌드 프로세스에 의해 자동으로 생성됩니다. 도구 패키지 Grpc.Toolsgreet.proto 파일을 기반으로 하여 다음 파일을 생성합니다.

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs: 요청 및 응답 메시지 형식을 채우고 직렬화하고 검색하는 프로토콜 버퍼 코드입니다.
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs: 생성된 클라이언트 클래스를 포함합니다.

Grpc.Tools에 의해 자동으로 생성된 C# 자산에 대한 자세한 내용은 C#을 사용하는 gRPC 서비스: 생성된 C# 자산을 참조하세요.

  • 다음 코드를 사용하여 gRPC 클라이언트 Program.cs 파일을 업데이트합니다.

    using System.Threading.Tasks;
    using Grpc.Net.Client;
    using GrpcGreeterClient;
    
    // The port number must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:7042");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
    
  • 위의 강조 표시된 코드에서 localhost 포트 번호 7042GrpcGreeter 서비스 프로젝트 내 Properties/launchSettings.json에 지정된 HTTPS 포트 번호로 바꿉니다.

Program.cs 에는 gRPC 클라이언트에 대한 진입점 및 논리가 포함되어 있습니다.

Greeter 클라이언트는 다음에 의해 생성됩니다.

  • gRPC 서비스에 대한 연결을 만들기 위한 정보가 포함된 GrpcChannel 인스턴스화.
  • GrpcChannel을 사용하여 Greeter 클라이언트를 구성합니다.
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Greeter 클라이언트가 비동기 SayHello 메서드를 호출합니다. SayHello 호출의 결과가 표시됩니다.

// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

gRPC Greeter 서비스를 사용하여 gRPC 클라이언트 테스트

appsettings.Development.json 다음 강조 표시된 줄을 추가하여 파일을 업데이트합니다.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
      ,"Microsoft.AspNetCore.Hosting": "Information",
      "Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"
    }
  }
}
  • Greeter 서비스에서 Ctrl+F5를 눌러 디버거 없이 서버를 시작합니다.
  • GrpcGreeterClient 프로젝트에서 Ctrl+F5를 눌러 디버거 없이 클라이언트를 시작합니다.

클라이언트가 GreeterClient라는 이름을 포함한 메시지와 함께 인사말을 서비스에 보냅니다. 서비스는 "Hello GreeterClient"라는 메시지를 응답으로 보냅니다. "Hello GreeterClient" 응답이 명령 프롬프트에 표시됩니다.

Greeting: Hello GreeterClient
Press any key to exit...

gRPC 서비스는 성공한 호출의 세부 정보를 명령 프롬프트에 작성된 로그에 기록합니다.

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:<port>/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

참고 항목

이 문서의 코드에는 gRPC 서비스 보호를 위해 ASP.NET Core HTTPS 개발 인증서가 필요합니다. .NET gRPC 클라이언트가 The remote certificate is invalid according to the validation procedure. 또는 The SSL connection could not be established. 메시지와 함께 실패하는 경우에는 개발 인증서를 신뢰할 수 없습니다. 이 문제를 해결하려면 신뢰할 수 없는/잘못된 인증서를 사용하여 gRPC 서비스 호출을 참조하세요.

다음 단계

이 자습서에서는 .NET Core gRPC 클라이언트와 ASP.NET Core gRPC 서버를 만드는 방법을 보여줍니다. 끝으로 gRPC Greeter 서비스와 통신하는 gRPC 클라이언트를 갖게 됩니다.

이 자습서에서는 다음을 수행합니다.

  • gRPC 서버를 만듭니다.
  • gRPC 클라이언트를 만듭니다.
  • gRPC Greeter 서비스를 사용하여 gRPC 클라이언트 테스트

필수 조건

gRPC 서비스 만들기

  • Visual Studio 2022를 시작하고 새 프로젝트 만들기를 선택합니다.
  • 새 프로젝트 만들기 대화 상자에서 gRPC를 검색합니다. ASP.NET Core gRPC 서비스를 선택하고 다음을 선택합니다.
  • 새 프로젝트 구성 대화 상자에서 프로젝트 이름으로 GrpcGreeter를 입력합니다. 코드를 복사하여 붙여넣을 때 네임스페이스가 일치하도록 프로젝트 이름을 GrpcGreeter로 지정해야 합니다.
  • 다음을 선택합니다.
  • 추가 정보 대화 상자에서 .NET 6.0(장기 지원)을 선택한 다음 만들기를 선택합니다.

서비스 실행

  • Ctrl+F5를 눌러 디버거 없이 실행합니다.

    프로젝트가 SSL을 사용하도록 아직 구성되지 않은 경우 Visual Studio에 다음 대화 상자가 표시됩니다.

    이 프로젝트는 SSL을 사용하도록 구성되었습니다. 브라우저에서 SSL 경고를 피하려면 IIS Express에서 생성한 자체 서명된 인증서를 신뢰하도록 선택할 수 있습니다. IIS Express SSL 인증서를 신뢰하시겠습니까?

    IIS Express SSL 인증서를 신뢰하는 경우 를 선택합니다.

    다음 대화 상자가 표시됩니다.

    보안 경고 대화 상자

    개발 인증서를 신뢰하는 데 동의하는 경우 를 선택합니다.

    Firefox 브라우저를 신뢰하는 방법에 대한 자세한 내용은 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 인증서 오류를 참조하세요.

    Visual Studio:

    • Kestrel 서버를 시작합니다.
    • 브라우저를 시작합니다.
    • http://localhost:7042와 같은 http://localhost:port로 이동합니다.
      • port: 앱에 임의로 할당된 포트 번호입니다.
      • localhost: 로컬 컴퓨터의 표준 호스트 이름입니다. Localhost는 로컬 컴퓨터의 웹 요청만 지원합니다.

로그는 https://localhost:<port>에서 수신 대기 중인 서비스를 보여 줍니다. 여기서 <port>Properties/launchSettings.json에서 프로젝트를 만들고 설정할 때 임의로 할당된 localhost 포트 번호입니다.

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

참고 항목

gRPC 템플릿은 TLS(전송 계층 보안)를 사용하도록 구성됩니다. gRPC 클라이언트는 HTTPS를 사용하여 서버를 호출해야 합니다. gRPC 서비스 localhost 포트 번호는 프로젝트를 만들고 설정할 때 gRPC 서비스 프로젝트의 Properties\launchSettings.json 파일에서 임의로 할당됩니다.

macOS는 TLS를 사용하는 ASP.NET Core gRPC를 지원하지 않습니다. macOS에서 gRPC 서비스를 성공적으로 실행하려면 추가 구성이 필요합니다. 자세한 내용은 macOS에서 ASP.NET Core gRPC 앱을 시작할 수 없음을 참조하세요.

프로젝트 파일 검토

GrpcGreeter 프로젝트 파일:

  • Protos/greet.proto: Greeter gRPC를 정의하고 gRPC 서버 자산을 생성하는 데 사용됩니다. 자세한 내용은 gRPC 소개를 참조하세요.
  • Services 폴더: Greeter 서비스의 구현이 들어 있습니다.
  • appSettings.json: Kestrel이 사용하는 프로토콜과 같은 구성 데이터가 들어 있습니다. 자세한 내용은 ASP.NET Core의 구성을 참조하세요.
  • Program.cs다음을 포함합니다.

.NET 콘솔 앱에서 gRPC 클라이언트 만들기

  • Visual Studio의 두 번째 인스턴스를 열고 새 프로젝트 만들기를 선택합니다.
  • 새 프로젝트 만들기 대화 상자에서 콘솔 애플리케이션을 선택하고 다음을 선택합니다.
  • 프로젝트 이름 텍스트 상자에 GrpcGreeterClient를 입력하고 다음을 선택합니다.
  • 추가 정보 대화 상자에서 .NET 6.0(장기 지원)을 선택한 다음 만들기를 선택합니다.

필요한 NuGet 패키지 추가

gRPC 클라이언트 프로젝트에는 다음 NuGet 패키지가 필요합니다.

  • Grpc.Net.Client는 .NET Core 클라이언트를 포함합니다.
  • Google.Protobuf는 C#용 protobuf 메시지 API를 포함합니다.
  • Grpc.Tools는 protobuf 파일에 대한 C# 도구 지원을 포함합니다. 도구 패키지는 런타임에 필요하지 않으므로 종속성은 PrivateAssets="All"로 표시됩니다.

PMC(패키지 관리자 콘솔) 또는 NuGet 패키지 관리를 사용하여 패키지를 설치합니다.

PMC를 사용한 패키지 설치

  • Visual Studio에서 도구>NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

  • 패키지 관리자 콘솔 창에서 실행 cd GrpcGreeterClient 하여 파일을 포함하는 GrpcGreeterClient.csproj 폴더로 디렉터리를 변경합니다.

  • 다음 명령을 실행합니다.

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    

패키지 설치를 위한 NuGet 패키지 관리 옵션

  • 솔루션 탐색기>NuGet 패키지 관리에서 프로젝트를 마우스 오른쪽 단추로 클릭합니다.
  • 찾아보기 탭을 선택합니다.
  • 검색 상자에 Grpc.Net.Client를 입력합니다.
  • 찾아보기 탭에서 Grpc.Net.Client 패키지를 선택하고 설치를 선택합니다.
  • Google.ProtobufGrpc.Tools에 대해 반복합니다.

greet.proto 추가

  • gRPC 클라이언트 프로젝트에서 Protos 폴더를 만듭니다.

  • gRPC Greeter 서비스에서 Protos\greet.proto 파일을 gRPC 클라이언트 프로젝트의 Protos 폴더에 복사합니다.

  • greet.proto 파일 내의 네임스페이스를 프로젝트의 네임스페이스로 업데이트합니다.

    option csharp_namespace = "GrpcGreeterClient";
    
  • GrpcGreeterClient.csproj 프로젝트 파일을 편집합니다.

프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 파일 편집을 선택합니다.

  • greet.proto 파일을 참조하는 <Protobuf> 요소를 사용하여 항목 그룹을 추가합니다.

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

Greeter 클라이언트 만들기

  • 클라이언트 프로젝트를 빌드하여 GrpcGreeterClient 네임스페이스에 형식을 만듭니다.

참고 항목

GrpcGreeterClient 형식은 빌드 프로세스에 의해 자동으로 생성됩니다. 도구 패키지 Grpc.Toolsgreet.proto 파일을 기반으로 하여 다음 파일을 생성합니다.

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs: 요청 및 응답 메시지 형식을 채우고 직렬화하고 검색하는 프로토콜 버퍼 코드입니다.
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs: 생성된 클라이언트 클래스를 포함합니다.

Grpc.Tools에 의해 자동으로 생성된 C# 자산에 대한 자세한 내용은 C#을 사용하는 gRPC 서비스: 생성된 C# 자산을 참조하세요.

  • 다음 코드를 사용하여 gRPC 클라이언트 Program.cs 파일을 업데이트합니다.

    using System.Threading.Tasks;
    using Grpc.Net.Client;
    using GrpcGreeterClient;
    
    // The port number must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:7042");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
    
  • 위의 강조 표시된 코드에서 localhost 포트 번호 7042GrpcGreeter 서비스 프로젝트 내 Properties/launchSettings.json에 지정된 HTTPS 포트 번호로 바꿉니다.

Program.cs 에는 gRPC 클라이언트에 대한 진입점 및 논리가 포함되어 있습니다.

Greeter 클라이언트는 다음에 의해 생성됩니다.

  • gRPC 서비스에 대한 연결을 만들기 위한 정보가 포함된 GrpcChannel 인스턴스화.
  • GrpcChannel을 사용하여 Greeter 클라이언트를 구성합니다.
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Greeter 클라이언트가 비동기 SayHello 메서드를 호출합니다. SayHello 호출의 결과가 표시됩니다.

// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

gRPC Greeter 서비스를 사용하여 gRPC 클라이언트 테스트

appsettings.Development.json 다음 강조 표시된 줄을 추가하여 파일을 업데이트합니다.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
      ,"Microsoft.AspNetCore.Hosting": "Information",
      "Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"
    }
  }
}
  • Greeter 서비스에서 Ctrl+F5를 눌러 디버거 없이 서버를 시작합니다.
  • GrpcGreeterClient 프로젝트에서 Ctrl+F5를 눌러 디버거 없이 클라이언트를 시작합니다.

클라이언트가 GreeterClient라는 이름을 포함한 메시지와 함께 인사말을 서비스에 보냅니다. 서비스는 "Hello GreeterClient"라는 메시지를 응답으로 보냅니다. "Hello GreeterClient" 응답이 명령 프롬프트에 표시됩니다.

Greeting: Hello GreeterClient
Press any key to exit...

gRPC 서비스는 성공한 호출의 세부 정보를 명령 프롬프트에 작성된 로그에 기록합니다.

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:<port>/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

참고 항목

이 문서의 코드에는 gRPC 서비스 보호를 위해 ASP.NET Core HTTPS 개발 인증서가 필요합니다. .NET gRPC 클라이언트가 The remote certificate is invalid according to the validation procedure. 또는 The SSL connection could not be established. 메시지와 함께 실패하는 경우에는 개발 인증서를 신뢰할 수 없습니다. 이 문제를 해결하려면 신뢰할 수 없는/잘못된 인증서를 사용하여 gRPC 서비스 호출을 참조하세요.

다음 단계

이 자습서에서는 .NET Core gRPC 클라이언트와 ASP.NET Core gRPC 서버를 만드는 방법을 보여줍니다. 끝으로 gRPC Greeter 서비스와 통신하는 gRPC 클라이언트를 갖게 됩니다.

이 자습서에서는 다음을 수행합니다.

  • gRPC 서버를 만듭니다.
  • gRPC 클라이언트를 만듭니다.
  • gRPC Greeter 서비스를 사용하여 gRPC 클라이언트 테스트

필수 조건

gRPC 서비스 만들기

  • Visual Studio 2022를 시작하고 새 프로젝트 만들기를 선택합니다.
  • 새 프로젝트 만들기 대화 상자에서 gRPC를 검색합니다. ASP.NET Core gRPC 서비스를 선택하고 다음을 선택합니다.
  • 새 프로젝트 구성 대화 상자에서 프로젝트 이름으로 GrpcGreeter를 입력합니다. 코드를 복사하여 붙여넣을 때 네임스페이스가 일치하도록 프로젝트 이름을 GrpcGreeter로 지정해야 합니다.
  • 다음을 선택합니다.
  • 추가 정보 대화 상자에서 .NET 6.0(장기 지원)을 선택한 다음 만들기를 선택합니다.

서비스 실행

  • Ctrl+F5를 눌러 디버거 없이 실행합니다.

    프로젝트가 SSL을 사용하도록 아직 구성되지 않은 경우 Visual Studio에 다음 대화 상자가 표시됩니다.

    이 프로젝트는 SSL을 사용하도록 구성되었습니다. 브라우저에서 SSL 경고를 피하려면 IIS Express에서 생성한 자체 서명된 인증서를 신뢰하도록 선택할 수 있습니다. IIS Express SSL 인증서를 신뢰하시겠습니까?

    IIS Express SSL 인증서를 신뢰하는 경우 를 선택합니다.

    다음 대화 상자가 표시됩니다.

    보안 경고 대화 상자

    개발 인증서를 신뢰하는 데 동의하는 경우 를 선택합니다.

    Firefox 브라우저를 신뢰하는 방법에 대한 자세한 내용은 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 인증서 오류를 참조하세요.

    Visual Studio:

    • Kestrel 서버를 시작합니다.
    • 브라우저를 시작합니다.
    • http://localhost:7042와 같은 http://localhost:port로 이동합니다.
      • port: 앱에 임의로 할당된 포트 번호입니다.
      • localhost: 로컬 컴퓨터의 표준 호스트 이름입니다. Localhost는 로컬 컴퓨터의 웹 요청만 지원합니다.

로그는 https://localhost:<port>에서 수신 대기 중인 서비스를 보여 줍니다. 여기서 <port>Properties/launchSettings.json에서 프로젝트를 만들고 설정할 때 임의로 할당된 localhost 포트 번호입니다.

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

참고 항목

gRPC 템플릿은 TLS(전송 계층 보안)를 사용하도록 구성됩니다. gRPC 클라이언트는 HTTPS를 사용하여 서버를 호출해야 합니다. gRPC 서비스 localhost 포트 번호는 프로젝트를 만들고 설정할 때 gRPC 서비스 프로젝트의 Properties\launchSettings.json 파일에서 임의로 할당됩니다.

macOS는 TLS를 사용하는 ASP.NET Core gRPC를 지원하지 않습니다. macOS에서 gRPC 서비스를 성공적으로 실행하려면 추가 구성이 필요합니다. 자세한 내용은 macOS에서 ASP.NET Core gRPC 앱을 시작할 수 없음을 참조하세요.

프로젝트 파일 검토

GrpcGreeter 프로젝트 파일:

  • Protos/greet.proto: Greeter gRPC를 정의하고 gRPC 서버 자산을 생성하는 데 사용됩니다. 자세한 내용은 gRPC 소개를 참조하세요.
  • Services 폴더: Greeter 서비스의 구현이 들어 있습니다.
  • appSettings.json: Kestrel이 사용하는 프로토콜과 같은 구성 데이터가 들어 있습니다. 자세한 내용은 ASP.NET Core의 구성을 참조하세요.
  • Program.cs다음을 포함합니다.

.NET 콘솔 앱에서 gRPC 클라이언트 만들기

  • Visual Studio의 두 번째 인스턴스를 열고 새 프로젝트 만들기를 선택합니다.
  • 새 프로젝트 만들기 대화 상자에서 콘솔 애플리케이션을 선택하고 다음을 선택합니다.
  • 프로젝트 이름 텍스트 상자에 GrpcGreeterClient를 입력하고 다음을 선택합니다.
  • 추가 정보 대화 상자에서 .NET 6.0(장기 지원)을 선택한 다음 만들기를 선택합니다.

필요한 NuGet 패키지 추가

gRPC 클라이언트 프로젝트에는 다음 NuGet 패키지가 필요합니다.

  • Grpc.Net.Client는 .NET Core 클라이언트를 포함합니다.
  • Google.Protobuf는 C#용 protobuf 메시지 API를 포함합니다.
  • Grpc.Tools는 protobuf 파일에 대한 C# 도구 지원을 포함합니다. 도구 패키지는 런타임에 필요하지 않으므로 종속성은 PrivateAssets="All"로 표시됩니다.

PMC(패키지 관리자 콘솔) 또는 NuGet 패키지 관리를 사용하여 패키지를 설치합니다.

PMC를 사용한 패키지 설치

  • Visual Studio에서 도구>NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

  • 패키지 관리자 콘솔 창에서 실행 cd GrpcGreeterClient 하여 파일을 포함하는 GrpcGreeterClient.csproj 폴더로 디렉터리를 변경합니다.

  • 다음 명령을 실행합니다.

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    

패키지 설치를 위한 NuGet 패키지 관리 옵션

  • 솔루션 탐색기>NuGet 패키지 관리에서 프로젝트를 마우스 오른쪽 단추로 클릭합니다.
  • 찾아보기 탭을 선택합니다.
  • 검색 상자에 Grpc.Net.Client를 입력합니다.
  • 찾아보기 탭에서 Grpc.Net.Client 패키지를 선택하고 설치를 선택합니다.
  • Google.ProtobufGrpc.Tools에 대해 반복합니다.

greet.proto 추가

  • gRPC 클라이언트 프로젝트에서 Protos 폴더를 만듭니다.

  • gRPC Greeter 서비스에서 Protos\greet.proto 파일을 gRPC 클라이언트 프로젝트의 Protos 폴더에 복사합니다.

  • greet.proto 파일 내의 네임스페이스를 프로젝트의 네임스페이스로 업데이트합니다.

    option csharp_namespace = "GrpcGreeterClient";
    
  • GrpcGreeterClient.csproj 프로젝트 파일을 편집합니다.

프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 파일 편집을 선택합니다.

  • greet.proto 파일을 참조하는 <Protobuf> 요소를 사용하여 항목 그룹을 추가합니다.

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

Greeter 클라이언트 만들기

  • 클라이언트 프로젝트를 빌드하여 GrpcGreeterClient 네임스페이스에 형식을 만듭니다.

참고 항목

GrpcGreeterClient 형식은 빌드 프로세스에 의해 자동으로 생성됩니다. 도구 패키지 Grpc.Toolsgreet.proto 파일을 기반으로 하여 다음 파일을 생성합니다.

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs: 요청 및 응답 메시지 형식을 채우고 직렬화하고 검색하는 프로토콜 버퍼 코드입니다.
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs: 생성된 클라이언트 클래스를 포함합니다.

Grpc.Tools에 의해 자동으로 생성된 C# 자산에 대한 자세한 내용은 C#을 사용하는 gRPC 서비스: 생성된 C# 자산을 참조하세요.

  • 다음 코드를 사용하여 gRPC 클라이언트 Program.cs 파일을 업데이트합니다.

    using System.Threading.Tasks;
    using Grpc.Net.Client;
    using GrpcGreeterClient;
    
    // The port number must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:7042");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
    
  • 위의 강조 표시된 코드에서 localhost 포트 번호 7042GrpcGreeter 서비스 프로젝트 내 Properties/launchSettings.json에 지정된 HTTPS 포트 번호로 바꿉니다.

Program.cs 에는 gRPC 클라이언트에 대한 진입점 및 논리가 포함되어 있습니다.

Greeter 클라이언트는 다음에 의해 생성됩니다.

  • gRPC 서비스에 대한 연결을 만들기 위한 정보가 포함된 GrpcChannel 인스턴스화.
  • GrpcChannel을 사용하여 Greeter 클라이언트를 구성합니다.
// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

Greeter 클라이언트가 비동기 SayHello 메서드를 호출합니다. SayHello 호출의 결과가 표시됩니다.

// The port number must match the port of the gRPC server.
using var channel = GrpcChannel.ForAddress("https://localhost:7042");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(
                  new HelloRequest { Name = "GreeterClient" });
Console.WriteLine("Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

gRPC Greeter 서비스를 사용하여 gRPC 클라이언트 테스트

  • Greeter 서비스에서 Ctrl+F5를 눌러 디버거 없이 서버를 시작합니다.
  • GrpcGreeterClient 프로젝트에서 Ctrl+F5를 눌러 디버거 없이 클라이언트를 시작합니다.

클라이언트가 GreeterClient라는 이름을 포함한 메시지와 함께 인사말을 서비스에 보냅니다. 서비스는 "Hello GreeterClient"라는 메시지를 응답으로 보냅니다. "Hello GreeterClient" 응답이 명령 프롬프트에 표시됩니다.

Greeting: Hello GreeterClient
Press any key to exit...

gRPC 서비스는 성공한 호출의 세부 정보를 명령 프롬프트에 작성된 로그에 기록합니다.

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:<port>
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:<port>/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

appsettings.Development.json 다음 줄을 추가하여 파일을 업데이트합니다.

"Microsoft.AspNetCore.Hosting": "Information",
"Microsoft.AspNetCore.Routing.EndpointMiddleware": "Information"

참고 항목

이 문서의 코드에는 gRPC 서비스 보호를 위해 ASP.NET Core HTTPS 개발 인증서가 필요합니다. .NET gRPC 클라이언트가 The remote certificate is invalid according to the validation procedure. 또는 The SSL connection could not be established. 메시지와 함께 실패하는 경우에는 개발 인증서를 신뢰할 수 없습니다. 이 문제를 해결하려면 신뢰할 수 없는/잘못된 인증서를 사용하여 gRPC 서비스 호출을 참조하세요.

다음 단계

이 자습서에서는 .NET Core gRPC 클라이언트와 ASP.NET Core gRPC 서버를 만드는 방법을 보여줍니다.

끝으로 gRPC Greeter 서비스와 통신하는 gRPC 클라이언트를 갖게 됩니다.

예제 코드 살펴보기 및 다운로드 (다운로드 방법). 다운로드 예제는 영역을 테스트하기 위한 기초적인 앱을 제공합니다.

이 자습서에서는 다음을 수행합니다.

  • gRPC 서버를 만듭니다.
  • gRPC 클라이언트를 만듭니다.
  • gRPC Greeter 서비스를 사용하여 gRPC 클라이언트 테스트

필수 조건

gRPC 서비스 만들기

  • Visual Studio를 시작하고 새 프로젝트 만들기를 선택합니다.
  • 새 프로젝트 만들기 대화 상자에서 gRPC 서비스를 선택한 후 다음을 선택합니다.
  • 새 프로젝트 구성 대화 상자에서 프로젝트 이름으로 GrpcGreeter를 입력합니다. 코드를 복사하여 붙여넣을 때 네임스페이스가 일치하도록 프로젝트 이름을 GrpcGreeter로 지정해야 합니다.
  • 다음을 선택합니다.
  • 추가 정보 대화 상자의 대상 프레임워크 드롭다운에서 .NET 5.0을 선택합니다.
  • 만들기를 실행합니다.

서비스 실행

  • Ctrl+F5를 눌러 디버거 없이 실행합니다.

    프로젝트가 SSL을 사용하도록 아직 구성되지 않은 경우 Visual Studio에 다음 대화 상자가 표시됩니다.

    이 프로젝트는 SSL을 사용하도록 구성되었습니다. 브라우저에서 SSL 경고를 피하려면 IIS Express에서 생성한 자체 서명된 인증서를 신뢰하도록 선택할 수 있습니다. IIS Express SSL 인증서를 신뢰하시겠습니까?

    IIS Express SSL 인증서를 신뢰하는 경우 를 선택합니다.

    다음 대화 상자가 표시됩니다.

    보안 경고 대화 상자

    개발 인증서를 신뢰하는 데 동의하는 경우 를 선택합니다.

    Firefox 브라우저를 신뢰하는 방법에 대한 자세한 내용은 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 인증서 오류를 참조하세요.

    Visual Studio가 IIS Express를 시작하고 앱을 실행합니다. 주소 표시줄에 localhost:port#이 표시되고 example.com 등은 표시되지 않습니다. localhost가 로컬 컴퓨터의 표준 호스트 이름이기 때문입니다. Localhost는 로컬 컴퓨터의 웹 요청만 지원합니다. Visual Studio가 웹 프로젝트를 만들면 임의의 포트가 웹 서버에 사용됩니다.

로그에는 https://localhost:5001에서 수신하는 서비스가 표시됩니다.

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

참고 항목

gRPC 템플릿은 TLS(전송 계층 보안)를 사용하도록 구성됩니다. gRPC 클라이언트는 HTTPS를 사용하여 서버를 호출해야 합니다.

macOS는 TLS를 사용하는 ASP.NET Core gRPC를 지원하지 않습니다. macOS에서 gRPC 서비스를 성공적으로 실행하려면 추가 구성이 필요합니다. 자세한 내용은 macOS에서 ASP.NET Core gRPC 앱을 시작할 수 없음을 참조하세요.

프로젝트 파일 검토

GrpcGreeter 프로젝트 파일:

  • greet.proto: Protos/greet.proto 파일은 Greeter gRPC를 정의하고 gRPC 서버 자산을 생성하는 데 사용됩니다. 자세한 내용은 gRPC 소개를 참조하세요.
  • Services 폴더: Greeter 서비스의 구현이 들어 있습니다.
  • appsettings.json: Kestrel에서 사용하는 프로토콜과 같은 구성 데이터를 포함합니다. 자세한 내용은 ASP.NET Core의 구성을 참조하세요.
  • Program.cs: gRPC 서비스의 진입점을 포함합니다. 자세한 내용은 ASP.NET Core의 .NET 제네릭 호스트를 참조하세요.
  • Startup.cs: 앱 동작을 구성하는 코드를 포함합니다. 자세한 내용은 앱 시작을 참조하세요.

.NET 콘솔 앱에서 gRPC 클라이언트 만들기

  • Visual Studio의 두 번째 인스턴스를 열고 새 프로젝트 만들기를 선택합니다.
  • 새 프로젝트 만들기 대화 상자에서 콘솔 앱(.NET Core)을 선택한 후 다음을 선택합니다.
  • 프로젝트 이름 텍스트 상자에 GrpcGreeterClient를 입력하고 만들기를 선택합니다.

필수 패키지 추가

gRPC 클라이언트 프로젝트에는 다음 패키지가 필요합니다.

  • Grpc.Net.Client는 .NET Core 클라이언트를 포함합니다.
  • Google.Protobuf는 C#용 protobuf 메시지 API를 포함합니다.
  • Grpc.Tools는 protobuf 파일에 대한 C# 도구 지원을 포함합니다. 도구 패키지는 런타임에 필요하지 않으므로 종속성은 PrivateAssets="All"로 표시됩니다.

PMC(패키지 관리자 콘솔) 또는 NuGet 패키지 관리를 사용하여 패키지를 설치합니다.

PMC를 사용한 패키지 설치

  • Visual Studio에서 도구>NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

  • 패키지 관리자 콘솔 창에서 실행 cd GrpcGreeterClient 하여 파일을 포함하는 GrpcGreeterClient.csproj 폴더로 디렉터리를 변경합니다.

  • 다음 명령을 실행합니다.

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    

패키지 설치를 위한 NuGet 패키지 관리 옵션

  • 솔루션 탐색기>NuGet 패키지 관리에서 프로젝트를 마우스 오른쪽 단추로 클릭합니다.
  • 찾아보기 탭을 선택합니다.
  • 검색 상자에 Grpc.Net.Client를 입력합니다.
  • 찾아보기 탭에서 Grpc.Net.Client 패키지를 선택하고 설치를 선택합니다.
  • Google.ProtobufGrpc.Tools에 대해 반복합니다.

greet.proto 추가

  • gRPC 클라이언트 프로젝트에서 Protos 폴더를 만듭니다.

  • gRPC Greeter 서비스에서 Protos\greet.proto 파일을 gRPC 클라이언트 프로젝트의 Protos 폴더에 복사합니다.

  • greet.proto 파일 내의 네임스페이스를 프로젝트의 네임스페이스로 업데이트합니다.

    option csharp_namespace = "GrpcGreeterClient";
    
  • GrpcGreeterClient.csproj 프로젝트 파일을 편집합니다.

    프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 파일 편집을 선택합니다.


  • greet.proto 파일을 참조하는 <Protobuf> 요소를 사용하여 항목 그룹을 추가합니다.

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

Greeter 클라이언트 만들기

  • 클라이언트 프로젝트를 빌드하여 GrpcGreeterClient 네임스페이스에 형식을 만듭니다.

참고 항목

GrpcGreeterClient 형식은 빌드 프로세스에 의해 자동으로 생성됩니다. 도구 패키지 Grpc.Toolsgreet.proto 파일을 기반으로 하여 다음 파일을 생성합니다.

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs: 요청 및 응답 메시지 형식을 채우고 직렬화하고 검색하는 프로토콜 버퍼 코드입니다.
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs: 생성된 클라이언트 클래스를 포함합니다.

Grpc.Tools에 의해 자동으로 생성된 C# 자산에 대한 자세한 내용은 C#을 사용하는 gRPC 서비스: 생성된 C# 자산을 참조하세요.

  • 다음 코드로 gRPC 클라이언트 Program.cs 파일을 업데이트합니다.

    using System;
    using System.Net.Http;
    using System.Threading.Tasks;
    using Grpc.Net.Client;
    
    namespace GrpcGreeterClient
    {
        class Program
        {
            static async Task Main(string[] args)
            {
                // The port number(5001) must match the port of the gRPC server.
                using var channel = GrpcChannel.ForAddress("https://localhost:5001");
                var client = new Greeter.GreeterClient(channel);
                var reply = await client.SayHelloAsync(
                                  new HelloRequest { Name = "GreeterClient" });
                Console.WriteLine("Greeting: " + reply.Message);
                Console.WriteLine("Press any key to exit...");
                Console.ReadKey();
            }
        }
    }
    

Program.cs 에는 gRPC 클라이언트에 대한 진입점 및 논리가 포함되어 있습니다.

Greeter 클라이언트는 다음에 의해 생성됩니다.

  • gRPC 서비스에 대한 연결을 만들기 위한 정보가 포함된 GrpcChannel 인스턴스화.
  • GrpcChannel을 사용하여 Greeter 클라이언트를 구성합니다.
static async Task Main(string[] args)
{
    // The port number(5001) must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
}

Greeter 클라이언트가 비동기 SayHello 메서드를 호출합니다. SayHello 호출의 결과가 표시됩니다.

static async Task Main(string[] args)
{
    // The port number(5001) must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
}

gRPC Greeter 서비스를 사용하여 gRPC 클라이언트 테스트

  • Greeter 서비스에서 Ctrl+F5를 눌러 디버거 없이 서버를 시작합니다.
  • GrpcGreeterClient 프로젝트에서 Ctrl+F5를 눌러 디버거 없이 클라이언트를 시작합니다.

클라이언트가 GreeterClient라는 이름을 포함한 메시지와 함께 인사말을 서비스에 보냅니다. 서비스는 "Hello GreeterClient"라는 메시지를 응답으로 보냅니다. "Hello GreeterClient" 응답이 명령 프롬프트에 표시됩니다.

Greeting: Hello GreeterClient
Press any key to exit...

gRPC 서비스는 성공한 호출의 세부 정보를 명령 프롬프트에 작성된 로그에 기록합니다.

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:5001/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

참고 항목

이 문서의 코드에는 gRPC 서비스 보호를 위해 ASP.NET Core HTTPS 개발 인증서가 필요합니다. .NET gRPC 클라이언트가 The remote certificate is invalid according to the validation procedure. 또는 The SSL connection could not be established. 메시지와 함께 실패하는 경우에는 개발 인증서를 신뢰할 수 없습니다. 이 문제를 해결하려면 신뢰할 수 없는/잘못된 인증서를 사용하여 gRPC 서비스 호출을 참조하세요.

다음 단계

이 자습서에서는 .NET Core gRPC 클라이언트와 ASP.NET Core gRPC 서버를 만드는 방법을 보여줍니다.

끝으로 gRPC Greeter 서비스와 통신하는 gRPC 클라이언트를 갖게 됩니다.

예제 코드 살펴보기 및 다운로드 (다운로드 방법). 다운로드 예제는 영역을 테스트하기 위한 기초적인 앱을 제공합니다.

이 자습서에서는 다음을 수행합니다.

  • gRPC 서버를 만듭니다.
  • gRPC 클라이언트를 만듭니다.
  • gRPC Greeter 서비스를 사용하여 gRPC 클라이언트 테스트

필수 조건

gRPC 서비스 만들기

  • Visual Studio를 시작하고 새 프로젝트 만들기를 선택합니다. 또는 Visual Studio 파일 메뉴에서 새로 만들기>프로젝트를 선택합니다.

  • 새 프로젝트 만들기 대화 상자에서 gRPC 서비스를 선택한 후 다음을 선택합니다.

    Visual Studio에서 새 프로젝트 대화 상자 만들기

  • 프로젝트 이름을 GrpcGreeter로 지정합니다. 코드를 복사하여 붙여넣을 때 네임스페이스가 일치하도록 프로젝트 이름을 GrpcGreeter로 지정해야 합니다.

  • 만들기를 실행합니다.

  • 새 gRPC 서비스 만들기 대화 상자에서 다음을 수행합니다.

    • gRPC 서비스 템플릿이 선택되어 있습니다.
    • 만들기를 실행합니다.

서비스 실행

  • Ctrl+F5를 눌러 디버거 없이 실행합니다.

    프로젝트가 SSL을 사용하도록 아직 구성되지 않은 경우 Visual Studio에 다음 대화 상자가 표시됩니다.

    이 프로젝트는 SSL을 사용하도록 구성되었습니다. 브라우저에서 SSL 경고를 피하려면 IIS Express에서 생성한 자체 서명된 인증서를 신뢰하도록 선택할 수 있습니다. IIS Express SSL 인증서를 신뢰하시겠습니까?

    IIS Express SSL 인증서를 신뢰하는 경우 를 선택합니다.

    다음 대화 상자가 표시됩니다.

    보안 경고 대화 상자

    개발 인증서를 신뢰하는 데 동의하는 경우 를 선택합니다.

    Firefox 브라우저를 신뢰하는 방법에 대한 자세한 내용은 Firefox SEC_ERROR_INADEQUATE_KEY_USAGE 인증서 오류를 참조하세요.

    Visual Studio가 IIS Express를 시작하고 앱을 실행합니다. 주소 표시줄에 localhost:port#이 표시되고 example.com 등은 표시되지 않습니다. localhost가 로컬 컴퓨터의 표준 호스트 이름이기 때문입니다. Localhost는 로컬 컴퓨터의 웹 요청만 지원합니다. Visual Studio가 웹 프로젝트를 만들면 임의의 포트가 웹 서버에 사용됩니다.

로그에는 https://localhost:5001에서 수신하는 서비스가 표시됩니다.

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development

참고 항목

gRPC 템플릿은 TLS(전송 계층 보안)를 사용하도록 구성됩니다. gRPC 클라이언트는 HTTPS를 사용하여 서버를 호출해야 합니다.

macOS는 TLS를 사용하는 ASP.NET Core gRPC를 지원하지 않습니다. macOS에서 gRPC 서비스를 성공적으로 실행하려면 추가 구성이 필요합니다. 자세한 내용은 macOS에서 ASP.NET Core gRPC 앱을 시작할 수 없음을 참조하세요.

프로젝트 파일 검토

GrpcGreeter 프로젝트 파일:

  • greet.proto: Protos/greet.proto 파일은 Greeter gRPC를 정의하고 gRPC 서버 자산을 생성하는 데 사용됩니다. 자세한 내용은 gRPC 소개를 참조하세요.
  • Services 폴더: Greeter 서비스의 구현이 들어 있습니다.
  • appsettings.json: Kestrel에서 사용하는 프로토콜과 같은 구성 데이터를 포함합니다. 자세한 내용은 ASP.NET Core의 구성을 참조하세요.
  • Program.cs: gRPC 서비스의 진입점을 포함합니다. 자세한 내용은 ASP.NET Core의 .NET 제네릭 호스트를 참조하세요.
  • Startup.cs: 앱 동작을 구성하는 코드를 포함합니다. 자세한 내용은 앱 시작을 참조하세요.

.NET 콘솔 앱에서 gRPC 클라이언트 만들기

  • Visual Studio의 두 번째 인스턴스를 열고 새 프로젝트 만들기를 선택합니다.
  • 새 프로젝트 만들기 대화 상자에서 콘솔 앱(.NET Core)을 선택한 후 다음을 선택합니다.
  • 프로젝트 이름 텍스트 상자에 GrpcGreeterClient를 입력하고 만들기를 선택합니다.

필수 패키지 추가

gRPC 클라이언트 프로젝트에는 다음 패키지가 필요합니다.

  • Grpc.Net.Client는 .NET Core 클라이언트를 포함합니다.
  • Google.Protobuf는 C#용 protobuf 메시지 API를 포함합니다.
  • Grpc.Tools는 protobuf 파일에 대한 C# 도구 지원을 포함합니다. 도구 패키지는 런타임에 필요하지 않으므로 종속성은 PrivateAssets="All"로 표시됩니다.

PMC(패키지 관리자 콘솔) 또는 NuGet 패키지 관리를 사용하여 패키지를 설치합니다.

PMC를 사용한 패키지 설치

  • Visual Studio에서 도구>NuGet 패키지 관리자>패키지 관리자 콘솔을 선택합니다.

  • 패키지 관리자 콘솔 창에서 실행 cd GrpcGreeterClient 하여 파일을 포함하는 GrpcGreeterClient.csproj 폴더로 디렉터리를 변경합니다.

  • 다음 명령을 실행합니다.

    Install-Package Grpc.Net.Client
    Install-Package Google.Protobuf
    Install-Package Grpc.Tools
    

패키지 설치를 위한 NuGet 패키지 관리 옵션

  • 솔루션 탐색기>NuGet 패키지 관리에서 프로젝트를 마우스 오른쪽 단추로 클릭합니다.
  • 찾아보기 탭을 선택합니다.
  • 검색 상자에 Grpc.Net.Client를 입력합니다.
  • 찾아보기 탭에서 Grpc.Net.Client 패키지를 선택하고 설치를 선택합니다.
  • Google.ProtobufGrpc.Tools에 대해 반복합니다.

greet.proto 추가

  • gRPC 클라이언트 프로젝트에서 Protos 폴더를 만듭니다.

  • gRPC Greeter 서비스에서 Protos\greet.proto 파일을 gRPC 클라이언트 프로젝트의 Protos 폴더에 복사합니다.

  • greet.proto 파일 내의 네임스페이스를 프로젝트의 네임스페이스로 업데이트합니다.

    option csharp_namespace = "GrpcGreeterClient";
    
  • GrpcGreeterClient.csproj 프로젝트 파일을 편집합니다.

    프로젝트를 마우스 오른쪽 단추로 클릭하고 프로젝트 파일 편집을 선택합니다.


  • greet.proto 파일을 참조하는 <Protobuf> 요소를 사용하여 항목 그룹을 추가합니다.

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

Greeter 클라이언트 만들기

  • 클라이언트 프로젝트를 빌드하여 GrpcGreeterClient 네임스페이스에 형식을 만듭니다.

참고 항목

GrpcGreeterClient 형식은 빌드 프로세스에 의해 자동으로 생성됩니다. 도구 패키지 Grpc.Toolsgreet.proto 파일을 기반으로 하여 다음 파일을 생성합니다.

  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\Greet.cs: 요청 및 응답 메시지 형식을 채우고 직렬화하고 검색하는 프로토콜 버퍼 코드입니다.
  • GrpcGreeterClient\obj\Debug\[TARGET_FRAMEWORK]\Protos\GreetGrpc.cs: 생성된 클라이언트 클래스를 포함합니다.

Grpc.Tools에 의해 자동으로 생성된 C# 자산에 대한 자세한 내용은 C#을 사용하는 gRPC 서비스: 생성된 C# 자산을 참조하세요.

다음 코드로 gRPC 클라이언트 Program.cs 파일을 업데이트합니다.

using System;
using System.Net.Http;
using System.Threading.Tasks;
using Grpc.Net.Client;

namespace GrpcGreeterClient
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // The port number(5001) must match the port of the gRPC server.
            using var channel = GrpcChannel.ForAddress("https://localhost:5001");
            var client = new Greeter.GreeterClient(channel);
            var reply = await client.SayHelloAsync(
                              new HelloRequest { Name = "GreeterClient" });
            Console.WriteLine("Greeting: " + reply.Message);
            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

Program.cs 에는 gRPC 클라이언트에 대한 진입점 및 논리가 포함되어 있습니다.

Greeter 클라이언트는 다음에 의해 생성됩니다.

  • gRPC 서비스에 대한 연결을 만들기 위한 정보가 포함된 GrpcChannel 인스턴스화.
  • GrpcChannel을 사용하여 Greeter 클라이언트를 구성합니다.
static async Task Main(string[] args)
{
    // The port number(5001) must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
}

Greeter 클라이언트가 비동기 SayHello 메서드를 호출합니다. SayHello 호출의 결과가 표시됩니다.

static async Task Main(string[] args)
{
    // The port number(5001) must match the port of the gRPC server.
    using var channel = GrpcChannel.ForAddress("https://localhost:5001");
    var client = new Greeter.GreeterClient(channel);
    var reply = await client.SayHelloAsync(
                      new HelloRequest { Name = "GreeterClient" });
    Console.WriteLine("Greeting: " + reply.Message);
    Console.WriteLine("Press any key to exit...");
    Console.ReadKey();
}

gRPC Greeter 서비스를 사용하여 gRPC 클라이언트 테스트

  • Greeter 서비스에서 Ctrl+F5를 눌러 디버거 없이 서버를 시작합니다.
  • GrpcGreeterClient 프로젝트에서 Ctrl+F5를 눌러 디버거 없이 클라이언트를 시작합니다.

클라이언트가 GreeterClient라는 이름을 포함한 메시지와 함께 인사말을 서비스에 보냅니다. 서비스는 "Hello GreeterClient"라는 메시지를 응답으로 보냅니다. "Hello GreeterClient" 응답이 명령 프롬프트에 표시됩니다.

Greeting: Hello GreeterClient
Press any key to exit...

gRPC 서비스는 성공한 호출의 세부 정보를 명령 프롬프트에 작성된 로그에 기록합니다.

info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\GH\aspnet\docs\4\Docs\aspnetcore\tutorials\grpc\grpc-start\sample\GrpcGreeter
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/2 POST https://localhost:5001/Greet.Greeter/SayHello application/grpc
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'gRPC - /Greet.Greeter/SayHello'
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished in 78.32260000000001ms 200 application/grpc

참고 항목

이 문서의 코드에는 gRPC 서비스 보호를 위해 ASP.NET Core HTTPS 개발 인증서가 필요합니다. .NET gRPC 클라이언트가 The remote certificate is invalid according to the validation procedure. 또는 The SSL connection could not be established. 메시지와 함께 실패하는 경우에는 개발 인증서를 신뢰할 수 없습니다. 이 문제를 해결하려면 신뢰할 수 없는/잘못된 인증서를 사용하여 gRPC 서비스 호출을 참조하세요.

다음 단계