/// <summary>
        /// Send a request to the configured service endpoint, and setup the state machine to accept the response.
        /// </summary>
        /// <typeparam name="TInstance">The state instance type</typeparam>
        /// <typeparam name="TData">The event data type</typeparam>
        /// <typeparam name="TRequest">The request message type</typeparam>
        /// <typeparam name="TResponse">The response message type</typeparam>
        /// <typeparam name="TException"></typeparam>
        /// <param name="binder">The event binder</param>
        /// <param name="request">The configured request to use</param>
        /// <param name="serviceAddressProvider"></param>
        /// <param name="messageFactory">The request message factory</param>
        /// <returns></returns>
        public static ExceptionActivityBinder <TInstance, TData, TException> Request <TInstance, TData, TException, TRequest, TResponse>(
            this ExceptionActivityBinder <TInstance, TData, TException> binder, Request <TInstance, TRequest, TResponse> request,
            ServiceAddressProvider <TInstance, TData, TException> serviceAddressProvider,
            EventExceptionMessageFactory <TInstance, TData, TException, TRequest> messageFactory)
            where TInstance : class, SagaStateMachineInstance
            where TData : class
            where TRequest : class
            where TResponse : class
            where TException : Exception
        {
            var activity = new FaultedRequestActivity <TInstance, TData, TException, TRequest, TResponse>(request, serviceAddressProvider, messageFactory);

            return(binder.Add(activity));
        }
Beispiel #2
0
        /// <summary>Inititialies a new <see cref="ClientSession"/>.</summary>
        /// <param name="authenticationSetting">The authentication settings.</param>
        /// <returns>The initialize session.</returns>
        public static ClientSession InitializeSession(AuthenticationSetting authenticationSetting)
        {
            Uri addressUri = ServiceAddressProvider.ServiceAddress(new Uri(authenticationSetting.ServiceUrl));

            ICredentials credentials = null;

            switch (authenticationSetting.AuthenticationScheme)
            {
            case AuthenticationScheme.UserNamePassword:
                credentials = new NetworkCredential(authenticationSetting.Username, authenticationSetting.Password);
                break;

            case AuthenticationScheme.AzureActiveDirectory:
                using (var client = new HttpClient())
                {
                    var result = client.PostAsync(new Uri(authenticationSetting.Authority + "/oauth2/token"), new FormUrlEncodedContent(new[]
                    {
                        new KeyValuePair <string, string>("resource", authenticationSetting.Resource),
                        new KeyValuePair <string, string>("client_id", authenticationSetting.ClientId),
                        new KeyValuePair <string, string>("grant_type", "password"),
                        new KeyValuePair <string, string>("username", authenticationSetting.Username),
                        new KeyValuePair <string, string>("password", authenticationSetting.Password),
                        new KeyValuePair <string, string>("scope", "openid"),
                        new KeyValuePair <string, string>("client_secret", authenticationSetting.ClientSecret),
                    })).Result;

                    var content    = result.Content.ReadAsStringAsync().Result;
                    var authResult = JsonConvert.DeserializeObject <OAuthResult>(content);
                    credentials = new TokenCredential(authResult.Access_Token);
                }
                break;

            case AuthenticationScheme.Windows:
                // Windows auth is supported
                break;

            default:
                throw new Exception("Unsupported Authentication Scheme");
            }

            var jsonClient = new JsonHttpClient(addressUri, credentials, authenticationSetting.AuthenticationScheme);

            return(new ClientSession(jsonClient, new NonDispatcher(), new TimerFactory <TaskTimer>()));
        }
 /// <summary>
 /// Initializes a new instance.
 /// </summary>
 /// <param name="request"></param>
 /// <param name="serviceAddressProvider"></param>
 /// <param name="asyncMessageFactory"></param>
 public MultiRequestActivity(MultiRequest <TInstance, TState, TRequest, TResponse> request, ServiceAddressProvider <TInstance> serviceAddressProvider, AsyncEventMultiMessageFactory <TInstance, TRequest> asyncMessageFactory) :
     base(request)
 {
     this.asyncMessageFactory = asyncMessageFactory;
     serviceAddressProvider   = context => serviceAddressProvider(context) ?? request.Settings.ServiceAddress;
 }
 /// <summary>
 /// Initializes a new instance.
 /// </summary>
 /// <param name="request"></param>
 /// <param name="messageFactory"></param>
 public MultiRequestActivity(MultiRequest <TInstance, TState, TRequest, TResponse> request, EventMultiMessageFactory <TInstance, TRequest> messageFactory) :
     base(request)
 {
     this.messageFactory    = messageFactory;
     serviceAddressProvider = context => request.Settings.ServiceAddress;
 }
 public RequestActivity(Request <TInstance, TRequest, TResponse> request, AsyncEventMessageFactory <TInstance, TRequest> messageFactory)
     : base(request)
 {
     _asyncMessageFactory    = messageFactory;
     _serviceAddressProvider = context => request.Settings.ServiceAddress;
 }
Beispiel #6
0
 public RequestActivity(Request <TInstance, TRequest, TResponse> request, ServiceAddressProvider <TInstance> serviceAddressProvider, EventMessageFactory <TInstance, TRequest> messageFactory)
     : base(request)
 {
     _messageFactory         = messageFactory;
     _serviceAddressProvider = context => serviceAddressProvider(context) ?? request.Settings.ServiceAddress;
 }
        /// <summary>Inititialies a new <see cref="ClientSession"/>.</summary>
        /// <param name="serviceAddress">The service Address.</param>
        /// <param name="tenantId">The optional tenant id.</param>
        /// <param name="company">The company to open</param>
        /// <param name="authentication">The authentication.</param>
        /// <param name="username">The username.</param>
        /// <param name="password">The password.</param>
        /// <returns>The initialize session.</returns>
        public static ClientSession InitializeSession(string serviceAddress, string tenantId = null, string company = null, AuthenticationScheme?authentication = null, string username = null, string password = null, string authority = null, string resource = null, string clientId = null, string clientSecret = null)
        {
            if (string.IsNullOrWhiteSpace(serviceAddress))
            {
                throw new ArgumentNullException("serviceAddress");
            }

            if (serviceAddress.Equals("https://businesscentral.dynamics.com", StringComparison.InvariantCultureIgnoreCase))
            {
                if (string.IsNullOrEmpty(tenantId))
                {
                    throw new Exception("tenantId must be specified");
                }
                // using Business Central Online  - locate tenant
                string  deploymentUrl = string.Format("https://businesscentral.dynamics.com/{0}/deployment/url", tenantId);
                var     webClient     = new System.Net.WebClient();
                var     data          = webClient.DownloadString(deploymentUrl);
                dynamic dyn           = JsonConvert.DeserializeObject(data);
                if (dyn.status != "Ready")
                {
                    throw new Exception(string.Format("Tenant {0} is not Ready ({1})", tenantId, dyn.status));
                }
                serviceAddress = dyn.data;
                var qidx = serviceAddress.IndexOf("?");
                if (qidx >= 0)
                {
                    serviceAddress = serviceAddress.Insert(qidx, "cs");
                }
                else
                {
                    if (!serviceAddress.EndsWith("/"))
                    {
                        serviceAddress += "/";
                    }
                    serviceAddress += "cs";
                }
            }
            else if (!string.IsNullOrEmpty(tenantId))
            {
                serviceAddress += "?tenant=" + tenantId;
            }

            if (!string.IsNullOrEmpty(company))
            {
                serviceAddress += (string.IsNullOrEmpty(tenantId) ? "?" : "&") + "company=" + Uri.EscapeDataString(company);
            }

            Uri addressUri = ServiceAddressProvider.ServiceAddress(new Uri(serviceAddress));

            ICredentials credentials = null;

            switch (authentication)
            {
            case AuthenticationScheme.UserNamePassword:
                credentials = new NetworkCredential(username, password);
                break;

            case AuthenticationScheme.AzureActiveDirectory:
                using (var client = new HttpClient())
                {
                    var result = client.PostAsync(new Uri(authority + "/oauth2/token"), new FormUrlEncodedContent(new[]
                    {
                        new KeyValuePair <string, string>("resource", resource),
                        new KeyValuePair <string, string>("client_id", clientId),
                        new KeyValuePair <string, string>("grant_type", "password"),
                        new KeyValuePair <string, string>("username", username),
                        new KeyValuePair <string, string>("password", password),
                        new KeyValuePair <string, string>("scope", "openid"),
                        new KeyValuePair <string, string>("client_secret", clientSecret),
                    })).Result;

                    var content    = result.Content.ReadAsStringAsync().Result;
                    var authResult = JsonConvert.DeserializeObject <OAuthResult>(content);
                    credentials = new TokenCredential(authResult.Access_Token);
                }
                break;

            case AuthenticationScheme.Windows:
                // Windows auth is supported
                break;

            default:
                throw new Exception("Unsupported Authentication Scheme");
            }

            var jsonClient = new JsonHttpClient(addressUri, credentials, authentication.GetValueOrDefault());

            return(new ClientSession(jsonClient, new NonDispatcher(), new TimerFactory <TaskTimer>()));
        }
Beispiel #8
0
        /// <summary>
        /// Send a request to the configured service endpoint, and setup the state machine to accept the response.
        /// </summary>
        /// <typeparam name="TInstance">The state instance type</typeparam>
        /// <typeparam name="TData">The event data type</typeparam>
        /// <typeparam name="TRequest">The request message type</typeparam>
        /// <typeparam name="TResponse">The response message type</typeparam>
        /// <param name="binder">The event binder</param>
        /// <param name="request">The configured request to use</param>
        /// <param name="serviceAddressProvider">A provider for the address used for the request</param>
        /// <param name="messageFactory">The request message factory</param>
        /// <returns></returns>
        public static EventActivityBinder <TInstance, TData> Request <TInstance, TData, TRequest, TResponse>(this EventActivityBinder <TInstance, TData> binder,
                                                                                                             Request <TInstance, TRequest, TResponse> request, ServiceAddressProvider <TInstance, TData> serviceAddressProvider,
                                                                                                             AsyncEventMessageFactory <TInstance, TData, TRequest> messageFactory)
            where TInstance : class, SagaStateMachineInstance
            where TData : class
            where TRequest : class
            where TResponse : class
        {
            ScheduleTokenId.UseTokenId <RequestTimeoutExpired <TRequest> >(x => x.RequestId);
            var activity = new RequestActivity <TInstance, TData, TRequest, TResponse>(request, serviceAddressProvider, messageFactory);

            return(binder.Add(activity));
        }