How to find a Service from ServiceStack RequestFilter
I am trying to implement
which conditionally executes based on the information in
to be called. I would like to do a
, look at it for a method / interface / attribute, and conditionally do my job based on that.
I know you can declare
, but I couldn't find a good way to make it conditional. I wanted to pass a delegate / lambda to an attribute, but C # doesn't allow that. I could have plugged the type or type name in there, allowing the
class / method to be found
, but seemed to be prone to copy / paste errors.
So, I am left with a little to learn about
to find out about
which is in effect (or declared) and then wants to find a method inside
that will provide the logic needed to turn the filter code on / off. I couldn't tell if some feature of the IoC container suggested, or if there is some other way to do it, or not.
And then, based on how the filter is being executed, you might want to return your own data, blocking the Service from actually executing. Is it possible? (Is this for the answer?)
source to share
This seems to be the key:
var serviceType = EndpointHost.Metadata.GetServiceTypeByRequest(requestDto.GetType());
Returns the type of service that will process the request. It's not an instance (but I doubt the service has been instantiated yet), so in order to execute the conditional logic, I had to define a static method and then watch it. I used reflection to find a method that declares a custom attribute and would need to optimize it for better performance.
From there I can conditionally determine if some logic should be run. I can also bypass the service call if I like and return a success response like this:
var successResponse = DtoUtils.CreateSuccessResponse(successMessage); var responseDto = DtoUtils.CreateResponseDto(requestDto, successResponse); var contentType = req.ResponseContentType; res.ContentType = contentType; res.WriteToResponse(req, responseDto); // this is the proper way to close the request; you can use Close() but it won't write out global headers res.EndServiceStackRequest(); return;
Or I can create an error response, or I can just go back from
and let the service run fine.
source to share