public object Any(GetCustomerOrders request)
{
return new GetCustomerOrders {
Customer = Gateway.Send(new GetCustomer { Id = request.Id }),
Orders = Gateway.Send(new QueryOrders { CustomerId = request.Id })
};
}
GetCustomerOrders will be protected as usual, but let assume “QueryOrders” requires Authentication as well.
I assume the QueryOrders operation could be invoked also directly so it will require authentication as well.
How should I instruct the Gateway to forward the authentication (for ex. a jwt token) validated for “GetCustomerOrders” to the n operation invoked through the gateway?
Am I on the right track or I’m missing somenthing?
The internal Gateway Services have access to the same IRequest and User Session that was validated by the external Service. When implementing a custom ServiceGateway you would capture the IRequest and forward the BearerToken from the IRequest to the Service Client used, e.g:
public class CustomServiceGatewayFactory : ServiceGatewayFactoryBase
{
private IRequest req;
public override IServiceGateway GetServiceGateway(IRequest request)
{
this.req = request;
return base.GetServiceGateway(request);
}
public override IServiceGateway GetGateway(Type requestType)
{
var isLocal = HostContext.Metadata.RequestTypes.Contains(requestType);
var gateway = isLocal
? (IServiceGateway)base.localGateway
: new JsonServiceClient(alternativeBaseUrl) {
BearerToken = req.GetBearerToken()
};
return gateway;
}
}
To save an overload in future, the ServiceGatewayFactoryBase captures the IRequest in base.Request from this commit.
That’s whatever remote ServiceStack instance that you want to forward the request to, each ServiceDiscovery solution is going to have its own implementation.
Ok that’s clear: if no discovery will be used, the gateway has to know the final(s) endpoint by itself.
IOW the gateway acts as “sugar programming” avoiding to create a JsonServiceClient anytime directly within the code.
About the
who should take care to dispose the instance created within the CustomServiceGatewayFactory?
a JsonServiceClient should be explicitly disposed after using it or the GC can take care on its own?
Service Clients don’t need to be explicitly disposed, each request creates and disposes a new .NET HttpWebRequest which get connection pooled behind-the-scenes, so they’re just normal object instances which are taken care of by the GC.
If the service clients all have an empty implementation of Dispose why implement IDisposable in the first place? I see that it’s IMessageProducer that originally inherits it. I’m sure there is a good reason, I just don’t know what it is.