Client API: Subscribing to Store Events
-
Events allow users to perform custom actions in response to operations made in a
Document Store
or aSession
. -
An event is invoked when the selected action is executed on an entity, or querying is performed.
-
Subscribing to an event at the
DocumentStore
level subscribes to this event in all subsequent sessions.E.g., to invoke an event after SaveChanges() is called by any subsequent session, use -
store.OnAfterSaveChanges += OnAfterSaveChangesEvent;
-
Subscribing to an event in a
Session
is valid only for this session.E.g., to invoke an event after SaveChanges() is called by this session only, use -
session.Advanced.OnAfterSaveChanges += OnAfterSaveChangesEvent;
Read more about
Session
events here. -
In this page:
Store Events
You can subscribe to the following events only at the store level, not within a session.
OnBeforeRequest
This event is invoked by sending a request to the server, before the request
is actually sent.
It should be defined with this signature:
private void OnBeforeRequestEvent(object sender, BeforeRequestEventArgs args);
Parameters:
Parameter | Type | Description |
---|---|---|
sender | IDocumentStore |
The subscribed store that triggered the event |
args | BeforeRequestEventArgs |
See details below |
BeforeRequestEventArgs
:
public class BeforeRequestEventArgs : EventArgs
{
// Database Name
public string Database { get; }
// Database URL
public string Url { get; }
// The request intended to be sent to the server
public HttpRequestMessage Request { get; }
// The number of attempts made to send the request to the server
public int AttemptNumber { get; }
}
-
Example:
To define a method that checks URLs sent in a document store request:
private void OnBeforeRequestEvent(object sender, BeforeRequestEventArgs args) { var forbiddenURL = new Regex("/databases/[^/]+/docs"); if (forbiddenURL.IsMatch(args.Url) == true) { // action to be taken if the URL is forbidden } }
To subscribe to the event:
// Subscribe to the event store.OnBeforeRequest += OnBeforeRequestEvent;
OnSucceedRequest
This event is invoked by receiving a successful reply from the server.
It should be defined with this signature:
private void OnSucceedRequestEvent(object sender, SucceedRequestEventArgs args);
Parameters:
Parameter | Type | Description |
---|---|---|
sender | IDocumentStore |
The subscribed store that triggered the event |
args | SucceedRequestEventArgs |
See details below |
SucceedRequestEventArgs
:
public class SucceedRequestEventArgs : EventArgs
{
// Database Name
public string Database { get; }
// Database URL
public string Url { get; }
// The message returned from the server
public HttpResponseMessage Response { get; }
// The original request sent to the server
public HttpRequestMessage Request { get; }
// The number of attempts made to send the request to the server
public int AttemptNumber { get; }
}
-
Example
To define a method that would be activated when a request succeeds:
private void OnSucceedRequestEvent(object sender, SucceedRequestEventArgs args) { if (args.Response.IsSuccessStatusCode == true) { // action to be taken after a successful request } }
To subscribe to the event:
// Subscribe to the event store.OnSucceedRequest += OnSucceedRequestEvent;
AfterDispose
This event is invoked immediately after a document store is disposed of.
It should be defined with this signature:
private void AfterDisposeEvent(object sender, EventHandler args);
Parameters:
Parameter | Type | Description |
---|---|---|
sender | IDocumentStore |
The subscribed store whose disposal triggered the event |
args | EventHandler |
args has no contents for this event |
BeforeDispose
This event is invoked immediately before a document store is disposed of.
It should be defined with this signature:
private void BeforeDisposeEvent(object sender, EventHandler args);
Parameters:
Parameter | Type | Description |
---|---|---|
sender | IDocumentStore |
The subscribed store whose disposal triggered the event |
args | EventHandler |
args has no contents for this event |
RequestExecutorCreated
This event is invoked when a Request Executor is created,
allowing you to subscribe to various events of the request executor.
It should be defined with this signature:
private void RequestExecutorCreatedEvent(object sender, RequestExecutor args);
Parameters:
Parameter | Type | Description |
---|---|---|
sender | IDocumentStore |
The subscribed store that triggered the event |
args | RequestExecutor |
The created Request Executor instance |
OnSessionCreated
This event is invoked after a session is created, allowing you, for example,
to change session configurations.
It should be defined with this signature:
private void OnSessionCreatedEvent(object sender, SessionCreatedEventArgs args);
Parameters:
Parameter | Type | Description |
---|---|---|
sender | IDocumentStore |
The subscribed store that triggered the event |
args | SessionCreatedEventArgs |
The created Session |
SessionCreatedEventArgs
:
public class SessionCreatedEventArgs : EventArgs
{
public InMemoryDocumentSessionOperations Session { get; }
}
-
Example
To define a method that would be activated when a session is created:
private void OnSessionCreatedEvent(object sender, SessionCreatedEventArgs args) { args.Session.MaxNumberOfRequestsPerSession = 100; }
To subscribe to the event:
// Subscribe to the event store.OnSessionCreated += OnSessionCreatedEvent;
OnFailedRequest
This event is invoked before a request fails. It allows you, for example, to track
and log failed requests.
It should be defined with this signature:
private void OnFailedRequestEvent(object sender, FailedRequestEventArgs args);
Parameters:
Parameter | Type | Description |
---|---|---|
sender | IDocumentStore |
The subscribed store that triggered the event |
args | FailedRequestEventArgs |
See details below |
FailedRequestEventArgs
:
public class FailedRequestEventArgs : EventArgs
{
// Database Name
public string Database { get; }
// Database URL
public string Url { get; }
// The exception returned from the server
public Exception Exception { get; }
// The message returned from the server
public HttpResponseMessage Response { get; }
// The original request sent to the server
public HttpRequestMessage Request { get; }
}
-
Example
To define a method that would be activated when a request fails:
private void OnFailedRequestEvent(object sender, FailedRequestEventArgs args) { Logger($"Failed request for database '{args.Database}' ('{args.Url}')", args.Exception); }
To subscribe to the event:
// Subscribe to the event store.OnFailedRequest += OnFailedRequestEvent;
OnTopologyUpdated
This event is invoked by a topology update (e.g. when a node is added),
after the topology is updated.
It should be defined with this signature:
private void OnTopologyUpdatedEvent(object sender, TopologyUpdatedEventArgs args);
Parameters:
Parameter | Type | Description |
---|---|---|
sender | IDocumentStore |
The subscribed store that triggered the event |
args | TopologyUpdatedEventArgs |
The updated list of nodes |
TopologyUpdatedEventArgs
:
public class TopologyUpdatedEventArgs : EventArgs
{
public Topology Topology { get; }
}
Topology
:
public class Topology
{
public long Etag;
public List
-
Example
To define a method that would be activated on a topology update:
void OnTopologyUpdatedEvent(object sender, TopologyUpdatedEventArgs args) { var topology = args.Topology; if (topology == null) return; for (var i = 0; i < topology.Nodes.Count; i++) { // perform relevant operations on the nodes after the topology was updated } }
To subscribe to the event:
// Subscribe to the event store.OnTopologyUpdated += OnTopologyUpdatedEvent;
Store/Session Events
- Subscribing to an event in a session limits the scope of the subscription to this session.
- When you subscribe to an event at the store level, the subscription is inherited by all subsequent sessions.
- OnBeforeStore
- OnAfterSaveChanges
- OnBeforeDelete
- OnBeforeQuery
- OnBeforeConversionToDocument
- OnAfterConversionToDocument
- OnBeforeConversionToEntity
- OnAfterConversionToEntity
- OnSessionDisposing