Итак, я настроил проект веб-API с помощью простого консольного приложения, работающего в качестве сервера, для приема удаленного вызова из интерфейса веб-API.Я запускаю его через визуальную студию IIS.Сначала я подумал, что экземпляр IIS-сервера вращается, вызывает проблему и не может найти работающую службу.
Код контроллера:
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
Channel channel = new Channel("0.0.0.0:50051", ChannelCredentials.Insecure);
var client = new Greeter.GreeterClient(channel);
String user = "you";
try
{
var reply = client.SayHello(new HelloRequest { Name = "user" });
var reply2 = client.SayHelloAgain(new HelloRequest { Name = user }, new CallOptions().WithWaitForReady(true));
channel.ShutdownAsync().Wait();
return new string[] { reply.Message, reply2.Message };
}
catch(Exception e)
{
return null;
}
Сервер выглядит следующим образом:
public class CustomerManager : Greeter.GreeterBase
{
// Server side handler of the SayHello RPC
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply { Message = "Hello customer " + request.Name });
}
public override Task<HelloReply> SayHelloAgain(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply { Message = "The second time I have had to tell you from the customer " + request.Name });
}
}
class Program
{
const int Port = 50051;
public static void Main(string[] args)
{
Server server = new Server
{
Services = { Greeter.BindService(new CustomerManager()) },
Ports = { new ServerPort("127.0.0.1", Port, ServerCredentials.Insecure) }
};
server.Start();
Console.WriteLine("Greeter server listening on port " + Port);
Console.WriteLine("Press any key to stop the server...");
Console.ReadKey();
server.ShutdownAsync().Wait();
}
}
}
трассировка стека:
в Grpc.Core.Internal.AsyncCall 2.UnaryCall(TRequest msg) in
T:\src\github\grpc\src\csharp\Grpc.Core\Internal\AsyncCall.cs:line 78
at
Grpc.Core.DefaultCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method
2 метод, хост String, параметры CallOptions, запрос TRequest) в T: \ src \ github \ grpc \ src \ csharp \ Grpc.Core \DefaultCallInvoker.cs: строка 46 в Grpc.Core.Interceptors.InterceptingCallInvoker.b__3_0 [TRequest, TResponse] (TRequest req, контекст ClientInterceptorContext 2 ctx) in
T:\src\github\grpc\src\csharp\Grpc.Core\Interceptors\InterceptingCallInvoker.cs:line
51 at
Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest
request, ClientInterceptorContext
2, метод BlockingUnaryCallContinuation 2 continuation) in
T:\src\github\grpc\src\csharp\Grpc.Core\ClientBase.cs:line 174 at
Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method
2, методы запроса запроса String, узел String T): \ src \ github \ grpc \ src \ csharp \ Grpc.Core \ Interceptors \ InterceptingCallInvoker.cs: строка 48 в Helloworld.Greeter.GreeterClient.SayHello (запрос HelloRequest, параметры CallOptions) в C: \ Users \ x165572 \ source \ repos\ grpc \ examples \ csharp \ Helloworld \ Greeter \ obj \ Debug \ netstandard1.5 \ HelloworldGrpc.cs: строка 120 в Helloworld.Greeter.GreeterClient.SayHello (запрос HelloRequest, заголовки метаданных, конечный срок Nullable`1, отмена CancellationTokenМаркер) в C: \ Users \ x165572 \ source \ repos \ grpc \ examples \ csharp \ Helloworld \ Greeter \ obj \ Debug \ netstandard1.5 \ HelloworldGrpc.cs: строка 110 в CustomerClient.Controllers.ValuesController.Get () в C: \ Users \ x165572 \ source \ repos \ grpc \ examples \ csharp \ Helloworld \ CustomerClient \ Controllers \ ValuesController.cs: строка 27
Это работает, потому что у меня есть простое консольное приложение, которое являетсявыступать в роли клиента и без проблем подключаться.