获取gRPC方法的自定义属性(ASP.NET)

kq4fsx7k  于 2023-05-02  发布在  .NET
关注(0)|答案(1)|浏览(164)

我有一个简单的自定义属性AuthorizedUser,它被附加到一个gRPC方法,如下所示:

[AuthorizedUser]
public override Task<ServerStatusReply> ServerStatus(ServerStatusRequest request, ServerCallContext context)
{
    // ...
    // some logic to create a response object, irrelevant for the question
    // ...
    return Task.FromResult(response);
}

然后,我为一元调用创建了一个拦截器,它拦截了这个方法:

public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(
    TRequest request,
    ServerCallContext context,
    UnaryServerMethod<TRequest, TResponse> continuation)
{
    // ??? - how do I get my custom attribute of the method?

    try
    {
        return await continuation(request, context);
    }
    catch (Exception ex)
    {
        // Note: The gRPC framework also logs exceptions thrown by handlers to .NET Core logging.
        _logger.LogError(ex, $"Error thrown by {context.Method}.");
        throw;
    }
}

所有的工作都很完美,但这里有一个问题--我如何知道哪个方法被拦截了,以及它附加了什么属性?
requestcontextcontinuation对象中,我能找到的最好的方法是方法的proto名称,而不是具有正确名称空间的实际C#方法ID。
我想知道该方法能够获得附加到该方法的所有属性的列表,以执行额外的自定义逻辑。

ajsxfq5m

ajsxfq5m1#

可以从端点元数据中获取属性

var httpContext = context.GetHttpContext();
var endpoint = httpContext.GetEndpoint();
var metadata = endpoint?.Metadata.GetMetadata<GrpcMethodMetadata>();
var attribute = metadata?.ServiceType.GetCustomAttributes(typeof(AuthorizedUser), inherit: false);

相关问题