Example #1
0
 public ServiceCallTask(ECollegeClient client, ECollegeResponseCache cache, T service)
 {
     this._cache   = cache;
     this._client  = client;
     this._service = service;
 }
        public void ExecuteService <T>(T service, Action <T> successCallback, Action <ServiceException> failureCallback, Action <T> finallyCallback,
                                       ECollegeResponseCache cache, TimeSpan?expiration, bool rerunAfterCacheHit, bool readFromCache, bool writeToCache) where T : BaseService
        {
            DoBackgroundWork(() =>
            {
                try
                {
                    Action <string> cacheCallback = null;

                    if (cache != null && service.IsCacheable)
                    {
                        var cacheKey = service.GetCacheKey();
                        if (readFromCache)
                        {
                            var cacheEntry = cache.Get(service.CacheScope, cacheKey, expiration);
                            if (cacheEntry != null)
                            {
                                HandleResponseContent(cacheEntry.Data, service, failureCallback, finallyCallback, successCallback, null);
                                if (!rerunAfterCacheHit)
                                {
                                    return;
                                }
                            }
                        }
                        if (writeToCache)
                        {
                            cacheCallback = (responseContent) => cache.Put(service.CacheScope, cacheKey, responseContent);
                        }
                    }

                    var client                 = new RestClient(RootUri);
                    client.FollowRedirects     = true;
                    client.MaxRedirects        = 10;
                    client.EnsureCallbacksOnUI = false;

                    if (AuthenticateIfRequired(service, failureCallback, finallyCallback, successCallback))
                    {
                        return;
                    }

                    if (_authenticator != null)
                    {
                        client.Authenticator = _authenticator;
                    }

                    var request = new RestRequest(service.Resource, service.RequestMethod);
                    service.PrepareRequest(request);

#if DEBUG
                    Debug.WriteLine("Request: " + request.Method + " - " + RootUri + request.Resource + " - " + PrettyPrint(request.Parameters));
#endif
                    client.ExecuteAsync(request, (response) =>
                    {
                        HandleResponse(response, service, failureCallback, finallyCallback, successCallback, cacheCallback);
                    });
                } catch (Exception e)
                {
                    HandleFailure(service, new ClientErrorException(service, e), failureCallback, finallyCallback);
                }
            });
        }