Как добавить метаданные для всех обращений к службе? Я знаю, как отправлять метаданные для конкретного вызова, но не могу найти, как добавить стандартные метаданные для всех вызовов.
Я попытался использовать клиентский перехватчик, чтобы добавить туда метаданные, но не похоже, что я могу манипулировать заголовками для контекста здесь.
Я использую gRPC в .net framework, а не в .net core.
Если это вызов клиента (а не вызов сервера), вы должны иметь возможность сделать это в перехватчике, переопределив вызов клиента, например:
public override AsyncClientStreamingCall<TRequest, TResponse> AsyncClientStreamingCall<TRequest, TResponse>(ClientInterceptorContext<TRequest, TResponse> context, AsyncClientStreamingCallContinuation<TRequest, TResponse> continuation)
{
Metadata newMetadata = // your logic here
context = new ClientInterceptorContext<TRequest, TResponse>(context.Method,
context.Host, context.Options.WithHeaders(newMetadata));
return base.AsyncClientStreamingCall(context, continuation);
}
(вам нужно будет переопределить все 5 методов клиентского вызова; AsyncClientStreamingCall
, AsyncDuplexStreamingCall
, AsyncServerStreamingCall
, AsyncUnaryCall
и BlockingUnaryCall
)
также у меня много проблем с поиском любой хорошей документации для grpc, которая объясняла бы такие вещи, как перехватчики, метаданные и т. д., я довольно долго пытался найти ответ на этот вопрос, прежде чем сдался и пришел сюда. Любой ресурс, который у вас может быть, будет принят с благодарностью.
@schh Я согласен, некоторые части плохо задокументированы. Я поддерживаю protobuf-net.Grpc, который позволяет запускать сценарии gRPC с кодом в .NET, опираясь на биты Google/Microsoft, поэтому мне пришлось копать довольно глубоко, чтобы найти нужные вещи. Если у вас есть какие-либо конкретные вопросы, я, вероятно, смогу помочь, но я не могу обещать открытый источник документации:/
о, хорошо :) это было бы фантастически, я нахожусь в процессе перехода с wcf на grpc atm, поэтому я уверен, что в какой-то момент у меня возникнут некоторые вопросы, до сих пор было довольно легко заставить все работать, всего пара из этих вещей у меня были проблемы с. плохое исследование старательно, прежде чем я приду к вам. Спасибо за предложение, очень признателен.
@schh может быть слишком поздно, но это может быть полезно: github.com/protobuf-net/protobuf-net.Grpc/tree/main/examples/…
Я просмотрел репозиторий и думаю, что если я смогу заставить это работать в .net framework, это даст вам бесплатный кофе :) Моя конечная цель - перенести весь мой проект на .net core, но мне нужно делать это постепенно, поэтому если я смогу заставить grpc работать в .net framework. Насколько я понимаю из документации, если я реализую сервер с Grpc.Core, я все еще могу использовать protobuf.net.Grpc для частей codefirst? Анализатор проекта по-прежнему утверждает, что System.ServiceModel не поддерживается, я использую пакет примитивов, поэтому я думаю, что это неверно, но хочу убедиться, прежде чем начать этот процесс.
@schh да, все это работает как в .net core, так и в .net framework, и в .net 5; в библиотеке есть альтернативные атрибуты, если вы хотите избежать атрибутов сервисной модели, см. [Service]
. Вы также должны проверить protobuf-net.BuildTools, который добавляет интеграцию с IDE и анализаторы, поэтому он сообщает вам о проблемах, как только вы их вводите (и вскоре компиляция AOT)
хорошо, отлично, я застрял на создании и запуске сервера, так как теперь у меня нет автоматически сгенерированного класса для такой привязки: Services = {ServerInformationService.BindService(serverInformationService).Intercept(versionInterceptor)},
@schh k, я могу попытаться посмотреть на это в понедельник, но чтобы я правильно понял сценарий: вы хотите добавить перехватчик на стороне клиента в .NET Framework (итак: используя транспорт Google, то есть Grpc.Core), что прозрачно добавляет метаданные к запросам. Это правильно? Я запутался, потому что похоже, что ваш код (сообщение выше) - это регистрация сервера... но вы говорили о клиентских перехватчиках. Так что уточните пожалуйста: здесь клиент или сервер?
@schh, в таком случае вам просто нужно использовать .Intercept
на канале? grpc.github.io/grpc/csharp/api/…
хорошо, большое спасибо :) да, у меня есть оба, клиент добавляет метаданные, и я проверяю их на другом сервере-перехватчике.
Давайте продолжим обсуждение в чате.
@MarcGravell, возможно ли добиться этого в protobuf-net grpc?
@ AsımGündüz да, перехватчики работают идентично с protobuf-net.Grpc - то, как вы их подключаете, может немного отличаться, но не сильно
Более элегантное решение для клиента (действительно для всех запросов):
var channel = new Grpc.Core.Channel("localhost", 5001, ssl);
var invoker = channel.Intercept(m => { m.Add("my-custom-header", "my value 123"); return m; });
var client = new Greeter.GreeterClient(invoker);
Спасибо за быстрый ответ. Мне удалось пропустить метод WithHeaders :) Это работает, я никогда не ожидал, что придется перезаписывать весь контекст новым.