/// <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)); }
/// <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; }
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>())); }
/// <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)); }