using BeWo.Data; using BeWo.Service.Attributes; using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel.Channels; using System.ServiceModel; using System.Text; using System.Threading.Tasks; using System.Web; using System.Xml; using System.ServiceModel.Dispatcher; using BeWo.Service.Core; using BS.Shared.Extensions; using BeWo.Service.ServiceUtils; using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; using DevExpress.CodeParser; namespace BeWo.Service.ServiceBehavior { public class AdminMultitenancyContextInitializer : ICallContextInitializer { public void AfterInvoke(object pCorrelationState) { if (pCorrelationState is MultitenancyOperationContextExt) { OperationContext.Current.Extensions.Remove((MultitenancyOperationContextExt)pCorrelationState); } } public object BeforeInvoke(InstanceContext pInstanceContext, IClientChannel pChannel, Message pMessage) { string lTenant = null; var (lInterface, lMethod) = ServiceHelper.GetInterfaceAndMethodASP(pMessage, pChannel); var lTemp = ServiceHelper.GetCustomAttribute(lInterface, lMethod); if (lTemp is object) { return null; } // Hole tenant aus Query // Wird erstmal nicht benötigt. Per Header besser // Ungefähr auf einem Level wie Username //if (pMessage.Properties?.Via is Uri uri) //{ // var query = HttpUtility.ParseQueryString(uri.Query); // var tenant = query["tenant"]; // lTenant = tenant; //} // Hole tenant aus Header if (string.IsNullOrWhiteSpace(lTenant)) { var prop = (HttpRequestMessageProperty)pMessage.Properties[HttpRequestMessageProperty.Name]; lTenant = prop?.Headers["tenant"]; } // Wenn kein Tenant gefunden wird, if (string.IsNullOrWhiteSpace(lTenant)) { throw new ArgumentException($"Zugriff verweigert. Tenant (\'{lTenant}\') darf nicht leer sein.", nameof(lTenant)); } var lExt = new MultitenancyOperationContextExt { Tenant = lTenant }; OperationContext.Current.Extensions.Add(lExt); return lExt; } } }