ServiceModel.Grpc

Code-first for gRPC

View on GitHub

Migrate a WCF service and client to a gRPC with ServiceModel.Grpc

This page shows how to migrate existing WCF services and clients to gRPC with minimum effort.

View sample code.

The existing WCF solution

The MigrateWCFTogRpc.sln includes a simple request-response Person service. WCF service contract:

[ServiceContract]
public interface IPersonService
{
    [OperationContract]
    Task<Person> Get(int personId);

    [OperationContract]
    Task<IList<Person>> GetAll();
}

The Person type is a simple data contract class:

[DataContract]
public class Person
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string SecondName { get; set; }
}

Projects

Migrate to gRPC

With ServiceModel.Grpc migration is simple:

Host PersonService in ASP.NET Core server

The project AspNetServiceHost is already configured and has reference to the nuget package ServiceModel.Grpc.AspNetCore.

All required configuration to host PersonService is done in the Program.cs:

// configure service provider
PersonModule.ConfigureServices(builder.Services);

// enable ServiceModel.Grpc
builder.Services.AddServiceModelGrpc();

// host PersonService
app.MapGrpcService<PersonService>();

Host PersonService in Grpc.Core server

The project NativeServiceHost is already configured and has reference to the nuget package ServiceModel.Grpc.SelfHost.

All required configuration to host PersonService is done in Program.cs and ServerHost.cs:

// create service provider
PersonModule.ConfigureServices(services);

// create and configure Grpc.Core.Server
_server = new Server { /*  */ };

// host PersonService
_server.Services.AddServiceModel<PersonService>(serviceProvider);

Migrate client

The project gRPCClient has reference to nuget package ServiceModel.Grpc.

// create ClientFactory
private static readonly IClientFactory DefaultClientFactory = new ClientFactory();

// create gRPC Channel
var channel = new Channel("localhost", 8080, ChannelCredentials.Insecure);

// create client
var proxy = DefaultClientFactory.CreateClient<IPersonService>(aspNetCoreChannel);

What is next

Migrate FaultContract exception handling to a gRPC global error handling.