Добавить метаданные для всех вызовов службы gRPC

Как добавить метаданные для всех обращений к службе? Я знаю, как отправлять метаданные для конкретного вызова, но не могу найти, как добавить стандартные метаданные для всех вызовов.

Я попытался использовать клиентский перехватчик, чтобы добавить туда метаданные, но не похоже, что я могу манипулировать заголовками для контекста здесь.

Я использую gRPC в .net framework, а не в .net core.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
2 496
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если это вызов клиента (а не вызов сервера), вы должны иметь возможность сделать это в перехватчике, переопределив вызов клиента, например:

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)

Спасибо за быстрый ответ. Мне удалось пропустить метод WithHeaders :) Это работает, я никогда не ожидал, что придется перезаписывать весь контекст новым.

schh 09.12.2020 17:27

также у меня много проблем с поиском любой хорошей документации для grpc, которая объясняла бы такие вещи, как перехватчики, метаданные и т. д., я довольно долго пытался найти ответ на этот вопрос, прежде чем сдался и пришел сюда. Любой ресурс, который у вас может быть, будет принят с благодарностью.

schh 09.12.2020 17:30

@schh Я согласен, некоторые части плохо задокументированы. Я поддерживаю protobuf-net.Grpc, который позволяет запускать сценарии gRPC с кодом в .NET, опираясь на биты Google/Microsoft, поэтому мне пришлось копать довольно глубоко, чтобы найти нужные вещи. Если у вас есть какие-либо конкретные вопросы, я, вероятно, смогу помочь, но я не могу обещать открытый источник документации:/

Marc Gravell 09.12.2020 21:55

о, хорошо :) это было бы фантастически, я нахожусь в процессе перехода с wcf на grpc atm, поэтому я уверен, что в какой-то момент у меня возникнут некоторые вопросы, до сих пор было довольно легко заставить все работать, всего пара из этих вещей у меня были проблемы с. плохое исследование старательно, прежде чем я приду к вам. Спасибо за предложение, очень признателен.

schh 10.12.2020 00:55

@schh может быть слишком поздно, но это может быть полезно: github.com/protobuf-net/protobuf-net.Grpc/tree/main/examples‌​/…

Marc Gravell 10.12.2020 10:47

Я просмотрел репозиторий и думаю, что если я смогу заставить это работать в .net framework, это даст вам бесплатный кофе :) Моя конечная цель - перенести весь мой проект на .net core, но мне нужно делать это постепенно, поэтому если я смогу заставить grpc работать в .net framework. Насколько я понимаю из документации, если я реализую сервер с Grpc.Core, я все еще могу использовать protobuf.net.Grpc для частей codefirst? Анализатор проекта по-прежнему утверждает, что System.ServiceModel не поддерживается, я использую пакет примитивов, поэтому я думаю, что это неверно, но хочу убедиться, прежде чем начать этот процесс.

schh 12.12.2020 18:16

@schh да, все это работает как в .net core, так и в .net framework, и в .net 5; в библиотеке есть альтернативные атрибуты, если вы хотите избежать атрибутов сервисной модели, см. [Service]. Вы также должны проверить protobuf-net.BuildTools, который добавляет интеграцию с IDE и анализаторы, поэтому он сообщает вам о проблемах, как только вы их вводите (и вскоре компиляция AOT)

Marc Gravell 12.12.2020 23:14

хорошо, отлично, я застрял на создании и запуске сервера, так как теперь у меня нет автоматически сгенерированного класса для такой привязки: Services = {ServerInformationService.BindService(serverInformationServic‌​e).Intercept(version‌​Interceptor)},

schh 13.12.2020 00:45

@schh k, я могу попытаться посмотреть на это в понедельник, но чтобы я правильно понял сценарий: вы хотите добавить перехватчик на стороне клиента в .NET Framework (итак: используя транспорт Google, то есть Grpc.Core), что прозрачно добавляет метаданные к запросам. Это правильно? Я запутался, потому что похоже, что ваш код (сообщение выше) - это регистрация сервера... но вы говорили о клиентских перехватчиках. Так что уточните пожалуйста: здесь клиент или сервер?

Marc Gravell 13.12.2020 10:26

@schh, в таком случае вам просто нужно использовать .Intercept на канале? grpc.github.io/grpc/csharp/api/…

Marc Gravell 13.12.2020 10:29

хорошо, большое спасибо :) да, у меня есть оба, клиент добавляет метаданные, и я проверяю их на другом сервере-перехватчике.

schh 13.12.2020 15:18

Давайте продолжим обсуждение в чате.

schh 13.12.2020 15:24

@MarcGravell, возможно ли добиться этого в protobuf-net grpc?

Asım Gündüz 01.10.2021 08:13

@ AsımGündüz да, перехватчики работают идентично с protobuf-net.Grpc - то, как вы их подключаете, может немного отличаться, но не сильно

Marc Gravell 01.10.2021 10:40

Более элегантное решение для клиента (действительно для всех запросов):

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);

Другие вопросы по теме