如何将当前区域性发送到c#中的Grpc服务器?

如何将当前区域性发送到c#中的Grpc服务器?,c#,grpc,C#,Grpc,在使用dotnetcore3的c#项目中,将我当前的文化从Grpc客户端发送到Grpc服务器的最佳做法是什么?阅读。此类包含一个名为Name的字符串属性。通常,您只需要通过执行CultureInfo.CurrentCulture来访问当前上下文 您还可以通过在CultureInfo.CurrentCulture上设置值,在服务器和客户端中定义自己的区域性 例: CultureInfo.CurrentCulture=newcultureinfo(“en-US”); 阅读。此类包含一个名为Name的

在使用dotnetcore3的c#项目中,将我当前的文化从Grpc客户端发送到Grpc服务器的最佳做法是什么?

阅读。此类包含一个名为
Name
的字符串属性。通常,您只需要通过执行
CultureInfo.CurrentCulture
来访问当前上下文

您还可以通过在
CultureInfo.CurrentCulture
上设置值,在服务器和客户端中定义自己的区域性

例:

CultureInfo.CurrentCulture=newcultureinfo(“en-US”);
阅读。此类包含一个名为
Name
的字符串属性。通常,您只需要通过执行
CultureInfo.CurrentCulture
来访问当前上下文

您还可以通过在
CultureInfo.CurrentCulture
上设置值,在服务器和客户端中定义自己的区域性

例:

CultureInfo.CurrentCulture=newcultureinfo(“en-US”);

我通过将区域性添加到标题并使用拦截器成功地做到了这一点:

public class ThreadCultureInterceptor : Interceptor
{
    public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(
        TRequest request,
        ServerCallContext context,
        UnaryServerMethod<TRequest, TResponse> continuation)
    {
        var headerLanguage = context.RequestHeaders.FirstOrDefault(t => t.Key == "language");
        if (headerLanguage != null)
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo(headerLanguage.Value);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(headerLanguage.Value);
        }

        return await continuation(request, context);
    }
}
公共类ThreadCultureInterceptor:拦截器
{
公共重写异步任务UnaryServerHandler(
TRequest请求,
ServerCallContext上下文,
一元服务器方法(续)
{
var headerLanguage=context.RequestHeaders.FirstOrDefault(t=>t.Key==“语言”);
if(headerLanguage!=null)
{
Thread.CurrentThread.CurrentCulture=新的CultureInfo(headerLanguage.Value);
Thread.CurrentThread.CurrentUICulture=新的CultureInfo(headerLanguage.Value);
}
返回等待继续(请求、上下文);
}
}
在Startup.cs中:

services.AddGrpc(options =>
{
    options.Interceptors.Add<ThreadCultureInterceptor>();
});
services.AddGrpc(选项=>
{
options.Interceptors.Add();
});
在客户端应用程序上:

var credentials = CallCredentials.FromInterceptor((context, metadata) =>
{
    if (!string.IsNullOrEmpty(loginResponse.Token))
    {
        metadata.Add("Authorization", $"Bearer {loginResponse.Token}");
        metadata.Add("Language", "en-US");
    }
    return Task.CompletedTask;
});

channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
    Credentials = ChannelCredentials.Create(new SslCredentials(), credentials)
});
client = channel.CreateGrpcService<IService>();
var-credentials=CallCredentials.FromInterceptor((上下文,元数据)=>
{
如果(!string.IsNullOrEmpty(loginResponse.Token))
{
Add(“Authorization”、$“Bearer{loginResponse.Token}”);
元数据。添加(“语言”、“美国英语”);
}
返回Task.CompletedTask;
});
通道=GrpcChannel.ForAddress(“https://localhost:5001“,新的GRPCC选项
{
Credentials=ChannelCredentials.Create(新建SslCredentials(),凭据)
});
client=channel.CreateGrpcService();

我通过将区域性添加到标题并使用拦截器成功地做到了这一点:

public class ThreadCultureInterceptor : Interceptor
{
    public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(
        TRequest request,
        ServerCallContext context,
        UnaryServerMethod<TRequest, TResponse> continuation)
    {
        var headerLanguage = context.RequestHeaders.FirstOrDefault(t => t.Key == "language");
        if (headerLanguage != null)
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo(headerLanguage.Value);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(headerLanguage.Value);
        }

        return await continuation(request, context);
    }
}
公共类ThreadCultureInterceptor:拦截器
{
公共重写异步任务UnaryServerHandler(
TRequest请求,
ServerCallContext上下文,
一元服务器方法(续)
{
var headerLanguage=context.RequestHeaders.FirstOrDefault(t=>t.Key==“语言”);
if(headerLanguage!=null)
{
Thread.CurrentThread.CurrentCulture=新的CultureInfo(headerLanguage.Value);
Thread.CurrentThread.CurrentUICulture=新的CultureInfo(headerLanguage.Value);
}
返回等待继续(请求、上下文);
}
}
在Startup.cs中:

services.AddGrpc(options =>
{
    options.Interceptors.Add<ThreadCultureInterceptor>();
});
services.AddGrpc(选项=>
{
options.Interceptors.Add();
});
在客户端应用程序上:

var credentials = CallCredentials.FromInterceptor((context, metadata) =>
{
    if (!string.IsNullOrEmpty(loginResponse.Token))
    {
        metadata.Add("Authorization", $"Bearer {loginResponse.Token}");
        metadata.Add("Language", "en-US");
    }
    return Task.CompletedTask;
});

channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
    Credentials = ChannelCredentials.Create(new SslCredentials(), credentials)
});
client = channel.CreateGrpcService<IService>();
var-credentials=CallCredentials.FromInterceptor((上下文,元数据)=>
{
如果(!string.IsNullOrEmpty(loginResponse.Token))
{
Add(“Authorization”、$“Bearer{loginResponse.Token}”);
元数据。添加(“语言”、“美国英语”);
}
返回Task.CompletedTask;
});
通道=GrpcChannel.ForAddress(“https://localhost:5001“,新的GRPCC选项
{
Credentials=ChannelCredentials.Create(新建SslCredentials(),凭据)
});
client=channel.CreateGrpcService();

这很好,但我的问题是,将文化从我的客户端发送到grpc服务器的正确方式是什么?示例:标题,附加参数。我的意图不是要打破任何标准,但我在文档中找不到这个主题。最佳实践确实是主观的。只要它不会对您的终端造成任何安全风险,您就可以选择。这很好,但我的问题是,如何正确地将文化从我的客户端发送到grpc服务器?示例:标题,附加参数。我的意图不是要打破任何标准,但我在文档中找不到这个主题。最佳实践确实是主观的。只要它不会给你带来任何安全风险,你就可以走了。