Esempio n. 1
0
        /// <summary>
        /// Calls service method which implements the X-Road operation.
        /// </summary>
        protected virtual void InvokeServiceMethod(XRoadContext context)
        {
            if (context.ServiceMap != null)
            {
                context.Result = InvokeMetaService(context);
                return;
            }

            context.ServiceMap          = context.Request.GetSerializer().GetServiceMap(context.Request.RootElementName);
            context.Response.BinaryMode = context.ServiceMap.OperationDefinition.OutputBinaryMode;

            var serviceObject = GetServiceObject(context);

            DeserializeMethodInput(context);

            try
            {
                var parameters = context.ServiceMap.RequestDefinition.ParameterInfo != null ? new [] { context.Parameters } : new object[0];
                context.Result = context.ServiceMap.OperationDefinition.MethodInfo.Invoke(serviceObject, parameters);
            }
            catch (Exception exception)
            {
                context.Exception = exception;
                OnInvocationError(context);

                if (context.Result == null)
                {
                    throw;
                }
            }
        }
Esempio n. 2
0
        protected override object GetServiceObject(XRoadContext context)
        {
            var service = serviceProvider.GetService(context.ServiceMap.OperationDefinition.MethodInfo.DeclaringType);

            if (service != null)
            {
                return(service);
            }

            throw new NotImplementedException();
        }
Esempio n. 3
0
        /// <summary>
        /// Deserializes X-Road request from SOAP message payload.
        /// </summary>
        protected virtual void DeserializeMethodInput(XRoadContext context)
        {
            var args = new BeforeDeserializationEventArgs();

            OnBeforeDeserialization(context, args);

            context.Request.ContentStream.Position = 0;
            var reader = XmlReader.Create(context.Request.ContentStream, args.XmlReaderSettings);

            reader.MoveToPayload(context.Request.RootElementName);

            context.Parameters = context.ServiceMap.DeserializeRequest(reader, context.Request);

            OnAfterDeserialization(context);
        }
Esempio n. 4
0
        /// <summary>
        /// Serializes service result to a X-Road message response.
        /// </summary>
        protected virtual void SerializeXRoadResponse(XRoadContext context)
        {
            OnBeforeSerialization(context);

            context.Request.ContentStream.Position = 0;
            using (var reader = XmlReader.Create(context.Request.ContentStream, new XmlReaderSettings {
                CloseInput = false
            }))
                using (var textWriter = new StreamWriter(context.Response.ContentStream, context.Response.ContentEncoding, 1024, true))
                    using (var writer = XmlWriter.Create(textWriter))
                    {
                        writer.WriteStartDocument();

                        if (reader.MoveToElement(0) && reader.IsCurrentElement(0, "Envelope", NamespaceConstants.SOAP_ENV))
                        {
                            writer.WriteStartElement(reader.Prefix, "Envelope", NamespaceConstants.SOAP_ENV);
                            writer.WriteAttributes(reader, true);
                        }
                        else
                        {
                            writer.WriteStartElement(PrefixConstants.SOAP_ENV, "Envelope", NamespaceConstants.SOAP_ENV);
                            writer.WriteAttributeString("xmlns", PrefixConstants.SOAP_ENV, NamespaceConstants.XMLNS, NamespaceConstants.SOAP_ENV);
                        }

                        if (reader.MoveToElement(1) && reader.IsCurrentElement(1, "Header", NamespaceConstants.SOAP_ENV))
                        {
                            writer.WriteNode(reader, true);
                        }

                        writer.WriteStartElement("Body", NamespaceConstants.SOAP_ENV);
                        if (reader.IsCurrentElement(1, "Body", NamespaceConstants.SOAP_ENV) || reader.MoveToElement(1, "Body", NamespaceConstants.SOAP_ENV))
                        {
                            writer.WriteAttributes(reader, true);
                        }

                        context.ServiceMap.SerializeResponse(writer, context.Result, context.Response, reader, null);

                        writer.WriteEndDocument();
                        writer.Flush();
                    }

            context.Response.SaveTo(context.HttpContext);

            OnAfterSerialization(context);
        }
Esempio n. 5
0
        /// <summary>
        /// Handle incoming web request as X-Road service request.
        /// </summary>
        public override void HandleRequest(HttpContext httpContext)
        {
            using (var context = new XRoadContext(httpContext))
            {
                if (httpContext.Request.Body.CanSeek && httpContext.Request.Body.Length == 0)
                {
                    throw XRoadException.InvalidQuery("Empty request content");
                }

                context.Request.LoadRequest(httpContext, storagePath, serviceManagers);
                if (context.Request.ServiceManager == null && context.Request.MetaServiceMap == null)
                {
                    var supportedProtocolsString = string.Join(", ", serviceManagers.Select(x => $@"""{x.Name}"""));
                    throw XRoadException.InvalidQuery($"Could not detect X-Road message protocol version from request message. Adapter supports following protocol versions: {supportedProtocolsString}.");
                }

                context.Response.Copy(context.Request);
                context.ServiceMap = context.Request.MetaServiceMap;

                OnRequestLoaded(context);
                InvokeServiceMethod(context);
                SerializeXRoadResponse(context);
            }
        }
Esempio n. 6
0
 /// <inheritdoc />
 protected override void HandleRequest(XRoadContext context)
 {
     ServiceManager.CreateServiceDescription(version: Version)
     .SaveTo(context.HttpContext.Response.OutputStream);
 }
Esempio n. 7
0
 /// <summary>
 /// Customize XML reader settings before deserialization of the X-Road message.
 /// </summary>
 protected virtual void OnBeforeDeserialization(XRoadContext context, BeforeDeserializationEventArgs args)
 {
 }
Esempio n. 8
0
 /// <summary>
 /// Handle exception that occured on service method invokation.
 /// </summary>
 protected virtual void OnInvocationError(XRoadContext context)
 {
 }
Esempio n. 9
0
 /// <summary>
 /// Intercept X-Road service request after request message is loaded.
 /// </summary>
 protected virtual void OnRequestLoaded(XRoadContext context)
 {
 }
Esempio n. 10
0
 /// <summary>
 /// Get main service object which implements the functionality of
 /// the operation.
 /// </summary>
 protected virtual object GetServiceObject(XRoadContext context)
 {
     return(null);
 }
Esempio n. 11
0
 /// <summary>
 /// Handle X-Road message protocol meta-service request.
 /// </summary>
 protected virtual object InvokeMetaService(XRoadContext context)
 {
     return(null);
 }
Esempio n. 12
0
 /// <summary>
 /// Intercept X-Road service request handling after serialization of the response message.
 /// </summary>
 protected virtual void OnAfterSerialization(XRoadContext context)
 {
 }
Esempio n. 13
0
 /// <summary>
 /// Intercept X-Road service request handling before serialization of the response message.
 /// </summary>
 protected virtual void OnBeforeSerialization(XRoadContext context)
 {
 }