private static async Task MakeServerStreamingCall(AllMethodsService.AllMethodsServiceClient client) { var deadline = DateTime.UtcNow.Add(TimeSpan.FromMinutes(1)); var request = new AllMethodsRequest { }; Console.WriteLine("starting call..."); var call = client.ServerStream(request, Metadata.Empty, deadline, CancellationToken.None); var headers = call.ResponseHeadersAsync; Console.WriteLine("got response headers: " + headers); Console.WriteLine("reading response stream..."); await foreach (var m in call.ResponseStream.ReadAllAsync()) { Console.WriteLine("read message: " + m); } Console.WriteLine("finished reading response stream."); var status = call.GetStatus(); Console.WriteLine("read status: " + status); var trailers = call.GetTrailers(); Console.WriteLine("read trailers: " + trailers); }
public override async Task <AllMethodsResponse> Unary(AllMethodsRequest request, ServerCallContext context) { // by default, the server always writes some custom response headers if (!request.DisableSendingExampleResponseHeaders) { await context.WriteResponseHeadersAsync(new Metadata { { "server-header", "server header value" }, { "server-header", "server header value duplicate" }, { "server-header-bin", Encoding.UTF8.GetBytes("server header binary value") }, }); } // always add some response trailers context.ResponseTrailers.Add("server-trailer", "server trailer value"); context.ResponseTrailers.Add("server-trailer", "server trailer value duplicate"); context.ResponseTrailers.Add("server-trailer-bin", Encoding.UTF8.GetBytes("server trailer binary value")); // wait for the requested amount of milliseconds await Task.Delay(request.PleaseDelayResponseMs); // are we requested to fail? set an error status or even throw switch (request.PleaseFail) { case FailRequest.MessageThenErrorStatus: context.Status = new Status(StatusCode.ResourceExhausted, "you requested an error"); break; case FailRequest.ErrorStatusOnly: throw new RpcException( new Status(StatusCode.ResourceExhausted, "you requested an error, no message"), new Metadata { { "server-trailer", "created by rpc exception on server" } } ); case FailRequest.None: context.Status = new Status(StatusCode.OK, "great!"); break; } return(new AllMethodsResponse { Answer = $"You asked: {request.Question}", YourDeadline = context.Deadline.ToString(CultureInfo.InvariantCulture), YourRequestHeaders = { MetadataToMap(context.RequestHeaders) }, YourFailRequest = request.PleaseFail, }); }
static void Main(string[] args) { AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true); var channel = GrpcChannel.ForAddress("http://localhost:5000", new GrpcChannelOptions()); var client = new AllMethodsService.AllMethodsServiceClient(channel); try { var deadline = DateTime.UtcNow.Add(TimeSpan.FromMinutes(1)); var request = new AllMethodsRequest { PleaseFail = FailRequest.None }; // MakeServerStreamingCall(client, deadline, request).GetAwaiter().GetResult(); MakeUnaryCall(client, deadline, request).GetAwaiter().GetResult(); } catch (Exception exception) { Console.WriteLine($"ERROR"); Console.WriteLine($"{exception.Message}"); } }
private static async Task MakeUnaryCall(AllMethodsService.AllMethodsServiceClient client, DateTime deadline, AllMethodsRequest request) { Console.WriteLine("starting call..."); var call = client.UnaryAsync(request, Metadata.Empty, deadline, CancellationToken.None); var headers = await call.ResponseHeadersAsync; Console.WriteLine("got response headers: " + headers); Console.WriteLine("reading response..."); var msg = await call.ResponseAsync; Console.WriteLine("got response message: " + msg); var status = call.GetStatus(); Console.WriteLine("read status: " + status); var trailers = call.GetTrailers(); Console.WriteLine("read trailers: " + trailers); }