gpt4 book ai didi

.net - 使用Azure Service Fabric的默认客户端时如何向请求添加消息头?

转载 作者:行者123 更新时间:2023-12-03 23:29:33 25 4
gpt4 key购买 nike

我想知道是否可以将自定义消息头注入(inject)到传出请求中以携带附加信息,而无需反序列化有效负载来完成身份验证、验证或请求关联等功能,例如通过消息检查器提供的 wcf ?

最佳答案

更新

使用 SDK v2,您现在可以(相对)轻松地修改 Reliable Services 和 Actor 的 header 。请注意,为了简洁起见,在下面的示例中省略了一些包装器成员。

客户端

我们使用ServiceProxyFactory来创建代理而不是静态ServiceProxy。然后我们可以包装 IServiceRemotingClientFactoryIServiceRemotingClient 并拦截服务调用。使用 ActorProxyFactory 也可以完成同样的操作。请注意,这会覆盖 WcfServiceRemotingProviderAttribute 等属性的行为,因为我们自己显式指定客户端工厂。

_proxyFactory = new ServiceProxyFactory(c => new ServiceRemotingClientFactoryWrapper(
// we can use any factory here
new WcfServiceRemotingClientFactory(callbackClient: c)));

private class ServiceRemotingClientFactoryWrapper : IServiceRemotingClientFactory
{
private readonly IServiceRemotingClientFactory _inner;

public ServiceRemotingClientFactoryWrapper(IServiceRemotingClientFactory inner)
{
_inner = inner;
}

public async Task<IServiceRemotingClient> GetClientAsync(Uri serviceUri, ServicePartitionKey partitionKey, TargetReplicaSelector targetReplicaSelector,
string listenerName, OperationRetrySettings retrySettings, CancellationToken cancellationToken)
{
var client = await _inner.GetClientAsync(serviceUri, partitionKey, targetReplicaSelector, listenerName, retrySettings, cancellationToken).ConfigureAwait(false);
return new ServiceRemotingClientWrapper(client);
}
}

private class ServiceRemotingClientWrapper : IServiceRemotingClient
{
private readonly IServiceRemotingClient _inner;

public ServiceRemotingClientWrapper(IServiceRemotingClient inner)
{
_inner = inner;
}

public Task<byte[]> RequestResponseAsync(ServiceRemotingMessageHeaders messageHeaders, byte[] requestBody)
{
// use messageHeaders.AddHeader() here
return _inner.RequestResponseAsync(messageHeaders, requestBody);
}

public void SendOneWay(ServiceRemotingMessageHeaders messageHeaders, byte[] requestBody)
{
// use messageHeaders.AddHeader() here
_inner.SendOneWay(messageHeaders, requestBody);
}
}

服务器

继承 ServiceRemotingDispatcherActorServiceRemotingDispatcher 以检查 header 。

class CustomServiceRemotingDispatcher : ServiceRemotingDispatcher
{
public override async Task<byte[]> RequestResponseAsync(IServiceRemotingRequestContext requestContext, ServiceRemotingMessageHeaders messageHeaders, byte[] requestBody)
{
// read messageHeaders here
// or alternatively put them in an AsyncLocal<T> scope
// so they can be accessed down the call chain
return base.RequestResponseAsync(requestContext, messageHeaders, requestBody);
}
}

要使用此类,我们再次需要通过直接创建通信监听器来重写 ServiceRemotingProviderAttribute:

class MyService : StatelessService
{
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
yield return new ServiceInstanceListener(context => new WcfServiceRemotingListener(context, new CustomServiceRemotingDispatcher());
}
}

关于.net - 使用Azure Service Fabric的默认客户端时如何向请求添加消息头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34166193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com