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

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

            var serviceObject = GetServiceObject(context);

            DeserializeMethodInput(context);

            try
            {
                var parameters = context.ServiceMap.RequestValueDefinition.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;
                }
            }
        }
Example #2
0
        /// <summary>
        /// Deserializes X-Road request from SOAP message payload.
        /// </summary>
        protected virtual void DeserializeMethodInput(XRoadContextClassic 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);
        }
Example #3
0
        /// <summary>
        /// Handle incoming request.
        /// </summary>
        public virtual void ProcessRequest(HttpContext httpContext)
        {
            httpContext.Request.InputStream.Position = 0;
            httpContext.Response.ContentType         = $"text/xml; charset={encoding.HeaderName}";

            using (var context = new XRoadContextClassic(httpContext))
            {
                try
                {
                    HandleRequest(context);
                }
                catch (Exception exception)
                {
                    OnExceptionOccured(context, exception, null, null, null, null);
                }
            }
        }
Example #4
0
        /// <summary>
        /// Serializes service result to a X-Road message response.
        /// </summary>
        protected virtual void SerializeXRoadResponse(XRoadContextClassic context)
        {
            OnBeforeSerialization(context);

            context.Request.ContentStream.Position = 0;
            using (var reader = XmlReader.Create(context.Request.ContentStream, new XmlReaderSettings {
                CloseInput = false
            }))
            {
                var writer = new XmlTextWriter(context.Response.ContentStream, context.Response.ContentEncoding);

                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, CustomSerialization);

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

            context.Response.SaveTo(context.HttpContext);

            OnAfterSerialization(context);
        }
Example #5
0
        /// <summary>
        /// Handle current X-Road operation.
        /// </summary>
        protected override void HandleRequest(XRoadContextClassic context)
        {
            if (context.HttpContext.Request.InputStream.Length == 0)
            {
                throw XRoadException.InvalidQuery("Empty request content");
            }

            context.Request.LoadRequest(context.HttpContext, StoragePath.GetValueOrDefault(Path.GetTempPath()), supportedProtocols);
            if (context.Request.Protocol == null && context.Request.MetaServiceMap == null)
            {
                var supportedProtocolsString = string.Join(", ", supportedProtocols.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);
        }
 /// <summary>
 /// Handles service description request.
 /// </summary>
 protected override void HandleRequest(XRoadContextClassic context)
 {
     Protocol.WriteServiceDescription(context.HttpContext.Response.OutputStream, Version);
 }
Example #7
0
 /// <summary>
 /// Intercept X-Road service request handling after serialization of the response message.
 /// </summary>
 protected virtual void OnAfterSerialization(XRoadContextClassic context)
 {
 }
Example #8
0
 /// <summary>
 /// Intercept X-Road service request handling before serialization of the response message.
 /// </summary>
 protected virtual void OnBeforeSerialization(XRoadContextClassic context)
 {
 }
Example #9
0
 /// <summary>
 /// Customize XML reader settings before deserialization of the X-Road message.
 /// </summary>
 protected virtual void OnBeforeDeserialization(XRoadContextClassic context, BeforeDeserializationEventArgs args)
 {
 }
Example #10
0
 /// <summary>
 /// Handle exception that occured on service method invokation.
 /// </summary>
 protected virtual void OnInvocationError(XRoadContextClassic context)
 {
 }
Example #11
0
 /// <summary>
 /// Intercept X-Road service request after request message is loaded.
 /// </summary>
 protected virtual void OnRequestLoaded(XRoadContextClassic context)
 {
 }
Example #12
0
 /// <summary>
 /// Get main service object which implements the functionality of
 /// the operation.
 /// </summary>
 protected abstract object GetServiceObject(XRoadContextClassic context);
Example #13
0
 /// <summary>
 /// Handle X-Road message protocol meta-service request.
 /// </summary>
 protected abstract object InvokeMetaService(XRoadContextClassic context);
Example #14
0
 /// <summary>
 /// Handles all exceptions as technical SOAP faults.
 /// </summary>
 protected virtual void OnExceptionOccured(XRoadContextClassic context, Exception exception, FaultCode faultCode, string faultString, string faultActor, string details)
 {
     using (var writer = new XmlTextWriter(context.HttpContext.Response.OutputStream, encoding))
         SoapMessageHelper.SerializeSoapFaultResponse(writer, faultCode, faultString, faultActor, details, exception);
 }
Example #15
0
 /// <summary>
 /// Handle current X-Road operation.
 /// </summary>
 protected abstract void HandleRequest(XRoadContextClassic context);
Example #16
0
 /// <inheritdoc />
 protected override void HandleRequest(XRoadContextClassic context)
 {
     ServiceManager.CreateServiceDescription(version: Version)
     .SaveTo(context.HttpContext.Response.OutputStream);
 }