using System; using System.Collections.Generic; using System.IdentityModel.Claims; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Remoting.Channels; using System.ServiceModel; using System.ServiceModel.Channels; using System.ServiceModel.Dispatcher; using System.Text; using System.Threading.Tasks; using BeWo.Data; using BeWo.Data.Access; using BeWo.Service.Core; using BS.Shared.Core; using BS.Shared.Exceptions; using BS.Shared.Extensions; using NHibernate.Hql.Ast.ANTLR.Tree; namespace BeWo.Service.ServiceUtils { public static class ServiceHelper { public static FileLogger CoreLogger { get; } = new FileLogger(MergedConfig.GetSetting(WebConfigSetting.ServiceLogFilePath)); public static Tuple GetInterfaceAndMethodASP(Message request , IClientChannel channel) { // Hole Interface string lInterface = null; var segments = channel.LocalAddress.Uri.Segments; for (int i = 0; i < segments.Length; i++) { var seg = segments[i].Trim('/'); if (seg.EndsWith(".svc")) { lInterface = "I" + seg.Substring(0, seg.Length - 4); } } if (string.IsNullOrWhiteSpace(lInterface)) { throw new ArgumentException($"Zugriff verweigert. Interface unbekannt"); } // Hole Methode string lMethod = request.Properties[WebHttpDispatchOperationSelector.HttpOperationNamePropertyName] as string; if (string.IsNullOrWhiteSpace(lMethod)) { throw new ArgumentException($"Zugriff verweigert. Methode unbekannt"); } return new Tuple(lInterface, lMethod); } public static T GetCustomAttribute(Uri baseAddress, Uri request) where T : Attribute { // Hole Interface string lInterface = null; var segments = baseAddress.Segments; for (int i = 0; i < segments.Length; i++) { var seg = segments[i].Trim('/'); if (seg.EndsWith(".svc")) { lInterface = seg.Substring(0, seg.Length - 4); } } // Falls kein Interface gefunden wird if (string.IsNullOrWhiteSpace(lInterface) ) { throw new ArgumentException($"Zugriff verweigert. Interface unbekannt"); } // Wird für URLTemplate != Methodname verwendet var name = $"BeWo.Service.ServiceContracts.I{lInterface}"; var t = Type.GetType(name); var resolver = new UriTemplateResolver(baseAddress, t); var method = resolver.ResolveMethod(request.AbsoluteUri); var methodInfo = t.GetMethod(method); // Rückgabe return getCustomAttribute(methodInfo); } public static T GetCustomAttribute(string pServiceInterface, string pMethodName) where T : Attribute { MethodInfo methodInfo = null; try { // Hole entsprechende Methode var name = $"BeWo.Service.ServiceContracts.{pServiceInterface}"; var t = Type.GetType(name); methodInfo = t?.GetMethod(pMethodName); } catch (Exception) { throw new ArgumentException($"Zugriff verweigert. Interface oder Methode unbekannt"); } return getCustomAttribute(methodInfo); } private static T getCustomAttribute(MethodInfo methodInfo) where T : Attribute { if (methodInfo == null) { throw new ArgumentException($"Zugriff verweigert. Interface oder Methode unbekannt"); } // Hole Custome Attribute var attribute = methodInfo.GetCustomAttribute(); return attribute; } } }