private async Task <RepositoryDescription> GetRepositoryDescription(ServiceInvocationContext context)
        {
            // We use ConfigureAwait(false) to prevent .NET from trying to synchronize back to our current Sync Context (UI Thread/HttpContext/etc)
            // when continuing from await. We don't care about Sync Context, so this saves the perf hit of syncing back. Our caller will still
            // sync back to their current Sync Context when they await us, so this doesn't affect them.
            using (context.Trace.EnterExit())
            {
                try
                {
                    // Invoke the request
                    var url      = new Uri("/", UriKind.Relative);
                    var response = await context.GetAsync(url, context.CancellationToken)
                                   .ConfigureAwait(continueOnCapturedContext: false);

                    context.CancellationToken.ThrowIfCancellationRequested();
                    response.EnsureSuccessStatusCode();

                    // Parse the response as JSON
                    var json = JObject.Parse(await response.Content.ReadAsStringAsync()
                                             .ConfigureAwait(continueOnCapturedContext: false));

                    // Load the json in to a result
                    return(RepositoryDescription.FromJson(json, context.Trace, context.ResolveUrl(url)));
                }
                catch (Exception ex)
                {
                    context.Trace.Error(ex);
                    throw;
                }
            }
        }
        private async Task <ServiceClient> CreateClient(string serviceName, ServiceInvocationContext context)
        {
            using (context.Trace.EnterExit())
            {
                var service = await GetService(serviceName, context);

                return(new ServiceClient(service, this));
            }
        }
        private async Task <ServiceDescription> GetService(string serviceName, ServiceInvocationContext context)
        {
            using (context.Trace.EnterExit())
            {
                // TODO: Caching!
                var repoDesc = await GetRepositoryDescription(context);

                context.CancellationToken.ThrowIfCancellationRequested();
                return(repoDesc.Services.FirstOrDefault(svc => String.Equals(svc.Name, serviceName, StringComparison.OrdinalIgnoreCase)));
            }
        }
        private async Task<RepositoryDescription> GetRepositoryDescription(ServiceInvocationContext context)
        {
            // We use ConfigureAwait(false) to prevent .NET from trying to synchronize back to our current Sync Context (UI Thread/HttpContext/etc)
            // when continuing from await. We don't care about Sync Context, so this saves the perf hit of syncing back. Our caller will still 
            // sync back to their current Sync Context when they await us, so this doesn't affect them.
            using (context.Trace.EnterExit())
            {
                try
                {
                    // Invoke the request
                    var url = new Uri("/", UriKind.Relative);
                    var response = await context.GetAsync(url, context.CancellationToken)
                        .ConfigureAwait(continueOnCapturedContext: false);
                    context.CancellationToken.ThrowIfCancellationRequested();
                    response.EnsureSuccessStatusCode();

                    // Parse the response as JSON
                    var json = JObject.Parse(await response.Content.ReadAsStringAsync()
                        .ConfigureAwait(continueOnCapturedContext: false));

                    // Load the json in to a result
                    return RepositoryDescription.FromJson(json, context.Trace, context.ResolveUrl(url));
                }
                catch (Exception ex)
                {
                    context.Trace.Error(ex);
                    throw;
                }
            }
        }
 private async Task<ServiceClient> CreateClient(string serviceName, ServiceInvocationContext context)
 {
     using (context.Trace.EnterExit())
     {
         var service = await GetService(serviceName, context);
         return new ServiceClient(service, this);
     }
 }
 private async Task<ServiceDescription> GetService(string serviceName, ServiceInvocationContext context)
 {
     using (context.Trace.EnterExit())
     {
         // TODO: Caching!
         var repoDesc = await GetRepositoryDescription(context);
         context.CancellationToken.ThrowIfCancellationRequested();
         return repoDesc.Services.FirstOrDefault(svc => String.Equals(svc.Name, serviceName, StringComparison.OrdinalIgnoreCase));
     }
 }