Опция IgnoreUnknownServices¶
Среди настроек gRPC есть настройка IgnoreUnknownServices. Она отвечает за обработку gRPC-запросов к неизвестным сервисам или методам. Без неё (или если IgnoreUnknownServices = false) фреймворк gRPC будет возвращать статус Unimplemented сразу, не проходя весь конвейер целиком. Если же её включить - запрос пройдёт дальше по конвейеру ASP.NET.
От меня
Чтобы попробовать настройку в действии, сделаем следующее. Скопируем куда-нибудь наш файл country.proto и в копии добавим ещё один метод. Например
service CountryService {
rpc GetAll(google.protobuf.Empty) returns (stream CountryReply) {}
rpc GetFooBar(google.protobuf.Empty) returns (google.protobuf.Empty) {} //<-- новый метод
rpc Get(CountryIdRequest) returns (CountryReply) {}
rpc Delete(stream CountryIdRequest) returns (google.protobuf.Empty) {}
rpc Update(CountryUpdateRequest) returns (google.protobuf.Empty) {}
rpc Create(stream CountryCreationRequest) returns (stream CountryCreationReply) {}
}
Теперь запустим
grpcui, отключив чтение рефлексии и используя только модифицированный файл:В списке доступных методов появится наш метод
GetFooBar, хотя в приложении он заведомо не реализован, даже в сгенерированном коде.
Вот что будет, если мы обратимся к сервису с IgnoreUnknownServices = false:

Теперь, чтобы убедиться в том, что обработка запроса проходит дальше по конвейеру промежуточного ПО, добавим промежуточное ПО, выставляющее gRPC-статус NotFound:
//Выше предыдущий код Program.cs
app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
app.Use(async(context, next) =>
{
if (context.Request.ContentType == "application/grpc")
{
context.Response.OnStarting(() =>
{
if (context.Response.StatusCode == 404)
{
context.Response.ContentType = "application/grpc";
context.Response.Headers.Add("grpc-status", ((int)StatusCode.NotFound).ToString());
context.Response.StatusCode = 200; //Помним о том, что HTTP-код должен быть 200 OK
}
return Task.CompletedTask;
});
}
await next(context);
});
app.Run();
Запускаем, видим в gRPCUi следующее:
Последнее обновление :
6 апреля 2023 г.
Дата создания : 5 апреля 2023 г.
Дата создания : 5 апреля 2023 г.