Adding filters to monitor Mobile Services activities in a Windows Store app
The Azure Mobile Services SDK for Windows Store apps provides a mechanism with which we can add filters to the execution pipeline, to process all the requests and responses from the service. In this way, for example, we can use create a filter to log the OData requests that are sent and the JSON objects that are included in the body of Insert/Update calls.
Suppose that we have downloaded the Windows Azure Mobile Services Quickstart app for Windows Store. To add a Service Filter to it, we need to create a class that implemenents the IServiceFilter interface:
public class TraceFilter : IServiceFilter { public IAsyncOperation<IServiceFilterResponse> Handle(IServiceFilterRequest request, IServiceFilterContinuation continuation) { Debug.WriteLine("MOBILE SERVICE REQUEST:"); Debug.WriteLine("Uri: " + request.Uri); Debug.WriteLine("Method: " + request.Method); Debug.WriteLineIf(!string.IsNullOrWhiteSpace(request.Content), "Content: " + request.Content); Debug.WriteLine("======"); // Sends the actual request to the Mobile Service. var response = continuation.Handle(request); return response; } }
Within the Handle method, we have access to an object that represents the request that will be sent to the Mobile Service. In this example, we trace only a subset of the available data, but we have many other information, such as the Headers collection, the Content Type, ecc.
After logging, we call the continuation.Handle method, that actually sends the request. Note that it takes the request object as parameter, so by modifing it we can alter what is sent to the Mobile Service.
To add this filter to the execution pipeline, we must call the WithFilter method on the MobileServiceClient object that is declared in App.xaml.cs:
public static MobileServiceClient MobileService = new MobileServiceClient( "mobile_service_url", "mobile_service_application_key") .WithFilter(new TraceFilter());
The WithFilter method creates a new MobileServiceClient that automatically invokes the Handle method of the specified filter for every Mobile Service request.
Now we can run the app. Let’s save a new TodoItem and mark it as complete. In the Output window, we’ll see something like this:
MOBILE SERVICE REQUEST: Uri: https://service_name.azure-mobile.net/tables/TodoItem?$filter=(complete eq false) Method: GET ====== MOBILE SERVICE REQUEST: Uri: https://service_name.azure-mobile.net/tables/TodoItem Method: POST Content: {"text":"New Item","complete":false} ====== MOBILE SERVICE REQUEST: Uri: https://service_name.azure-mobile.net/tables/TodoItem/3 Method: PATCH Content: {"text":"Azione","complete":true,"id":3} ======
Note in particular that, at line 2, the Uri includes the OData filter the corresponds to the LINQ query used in the RefreshTodoItems method of MainPage.xaml.cs. The ability so see the actual filters can be very useful for debugging purpose.
Wow that was odd. I just wrote an really long comment but
after I clicked submit my comment didn’t show up. Grrrr… well I’m not writing all that
over again. Regardless, just wanted to say fantastic blog!