Vous pouvez utiliser gRPC pour héberger des services web dans une application .NET core.
Introduction
- gRPC est un cadre RPC haute performance, à code source ouvert, initialement développé par Google.
- Le cadre est basé sur un modèle client-serveur d'appels de procédures à distance. Une application cliente peut appeler directement des méthodes sur une application serveur comme s'il s'agissait d'un objet local.
Exemple
Code du serveur
class Program
{
static void Main(string[] args)
{
RunAsync().Wait();
}
private static async Task RunAsync()
{
var server = new Grpc.Core.Server
{
Ports = { { "127.0.0.1", 5000, ServerCredentials.Insecure } },
Services =
{
ServerServiceDefinition.CreateBuilder()
.AddMethod(Descriptors.Method, async (requestStream, responseStream, context) =>
{
await requestStream.ForEachAsync(async additionRequest =>
{
Console.WriteLine($"Recieved addition request, number1 = {additionRequest.X} --- number2 = {additionRequest.Y}");
await responseStream.WriteAsync(new AdditionResponse {Output = additionRequest.X + additionRequest.Y});
});
})
.Build()
}
};
server.Start();
Console.WriteLine($"Server started under [127.0.0.1:5000]. Press Enter to stop it...");
Console.ReadLine();
await server.ShutdownAsync();
}
}
Code client
class Program
{
static void Main(string[] args)
{
RunAsync().Wait();
}
private static async Task RunAsync()
{
var channel = new Channel("127.0.0.1", 5000, ChannelCredentials.Insecure);
var invoker = new DefaultCallInvoker(channel);
using (var call = invoker.AsyncDuplexStreamingCall(Descriptors.Method, null, new CallOptions{}))
{
var responseCompleted = call.ResponseStream
.ForEachAsync(async response =>
{
Console.WriteLine($"Output: {response.Output}");
});
await call.RequestStream.WriteAsync(new AdditionRequest { X = 1, Y = 2});
Console.ReadLine();
await call.RequestStream.CompleteAsync();
await responseCompleted;
}
Console.WriteLine("Press enter to stop...");
Console.ReadLine();
await channel.ShutdownAsync();
}
}
Classes partagées entre le client et le serveur
[Schema]
public class AdditionRequest
{
[Id(0)]
public int X { get; set; }
[Id(1)]
public int Y { get; set; }
}
[Schema]
public class AdditionResponse
{
[Id(0)]
public int Output { get; set; }
}
Descripteurs de service
using Grpc.Core;
public class Descriptors
{
public static Method<AdditionRequest, AdditionResponse> Method =
new Method<AdditionRequest, AdditionResponse>(
type: MethodType.DuplexStreaming,
serviceName: "AdditonService",
name: "AdditionMethod",
requestMarshaller: Marshallers.Create(
serializer: Serializer<AdditionRequest>.ToBytes,
deserializer: Serializer<AdditionRequest>.FromBytes),
responseMarshaller: Marshallers.Create(
serializer: Serializer<AdditionResponse>.ToBytes,
deserializer: Serializer<AdditionResponse>.FromBytes));
}
Sérialiseur/Désérialiseur
public static class Serializer<T>
{
public static byte[] ToBytes(T obj)
{
var buffer = new OutputBuffer();
var writer = new FastBinaryWriter<OutputBuffer>(buffer);
Serialize.To(writer, obj);
var output = new byte[buffer.Data.Count];
Array.Copy(buffer.Data.Array, 0, output, 0, (int)buffer.Position);
return output;
}
public static T FromBytes(byte[] bytes)
{
var buffer = new InputBuffer(bytes);
var data = Deserialize<T>.From(new FastBinaryReader<InputBuffer>(buffer));
return data;
}
}
Sortie
Exemple de sortie client
Exemple de sortie du serveur
Références
- https://blogs.msdn.microsoft.com/dotnet/2018/12/04/announcing-net-core-3-preview-1-and-open-sourcing-Windows-desktop-frameworks/
- https://grpc.io/docs/
- https://grpc.io/docs/quickstart/csharp.html
- https://github.com/grpc/grpc/tree/master/src/csharp
Repères
- http://csharptest.net/787/benchmarking-wcf-compared-to-rpclibrary/index.html
0 votes
do I have to create a RESTful service?
- AFAIK oui (ou utiliser une solution tierce que je ne connais pas pour .NET Core)3 votes
WCF ne sera probablement pas porté vers .NET Core, car la majeure partie de la base de code dépend des bibliothèques internes de Windows. Pouvez-vous utiliser ASP.NET Core ? Vous disposerez alors d'un serveur HTTP facilement multiplateforme.
2 votes
WCF côté client est déjà supporté (je ne sais pas dans quelle mesure), le côté serveur est une demande de fonctionnalité chaudement débattue et votée.
0 votes
Il semble que Visual Studio 2017 15.5 et les versions ultérieures prennent en charge les éléments suivants générer des classes proxy client .NET Core . Il existe également une liste de caractéristiques prises en charge .
0 votes
Il existe un portage pour .NET Core : github.com/dotnet/wcf
7 votes
En bref : CoreWCF
0 votes
mobilize.net/blog/can-i-use-wcf-in-.net-core-3.1-or-.net5