Example #1
0
        /// <summary>
        /// Ermittlung aller Kennzeichen für den <see cref="TransportResponseType"/>
        /// </summary>
        /// <param name="response">Der <see cref="TransportResponseType"/> für den die Kennzeichen ermittelt werden sollen</param>
        /// <returns>Die ermittelten Kennzeichen</returns>
        public static IEnumerable <FlagType> GetReportFlags(this TransportResponseType response)
        {
            var result = new List <FlagType>();

            result.AddRange(GetReportFlags(response.TransportHeader));
            if (response.TransportBody?.Items != null)
            {
                result.AddRange(response.TransportBody.Items.OfType <PackageResponseType>().SelectMany(x => GetReportFlags(x.PackageHeader)));
            }
            return(result);
        }
        public void Sample()
        {
            // This example shows a Transport Response Delivery (TRD) message creation after a message
            // is received via Sealed Message Delivery (SMD). A static helper method is provided on
            // the client to help generate a TransportResponseType instance from a SealedMessageType
            // instance received via SMD, SIMD, or SMR.

            // TLS certificate used to authenticate the client to the TRD service during TLS connection.
            X509Certificate2 tlsCert = X509CertificateUtil.GetCertificate("TlsCertificateSerialNumber", X509FindType.FindBySerialNumber, StoreName.My, StoreLocation.CurrentUser, true);

            // Certificate used to decrypt a received SealedMessageType payload.
            X509Certificate2 payloadDecryptionCert = X509CertificateUtil.GetCertificate("PayloadDecryptionCertificateSerialNumber", X509FindType.FindBySerialNumber, StoreName.My, StoreLocation.CurrentUser, true);

            // Set up client.
            TransportResponseDeliveryClient trdClient = new TransportResponseDeliveryClient(tlsCert);

            // The SealedMessageType instance to generate a Transport Response for.
            // Typically, this would be available after an SMD, SIMD or SMR service invocation.
            Nehta.SMD2010.SMD.SealedMessageType sealedMessage = new Nehta.SMD2010.SMD.SealedMessageType();

            // Generate the Transport Response for the Sealed Message.
            TransportResponseType transportResponse = TransportResponseDeliveryClient.GetTransportResponse(
                new CommonSealedMessageType(sealedMessage),
                HIQualifiers.HPIOQualifier + "16 digit HPIO of sender organisation",
                ResponseClassType.Success,
                "DeliveryResponseCode",
                "DeliveryResponseMessage",
                DateTime.Now.ToUniversalTime(),
                new UniqueId().ToString(),
                true,
                null,
                payloadDecryptionCert
                );

            // Add the generated Transport Response to a list.
            List <TransportResponseType> transportResponses = new List <TransportResponseType>();

            transportResponses.Add(transportResponse);

            // Invoke the Deliver operation on the client, passing in the list of Transport Responses.
            deliverResponse response = trdClient.Deliver(transportResponses, new Uri("https://TRDServiceEndpoint"));
        }
Example #3
0
        /// <summary>
        /// Construct a transport response based on the received SealedMessageType instance (from SMD, SIMD or SMR).
        /// </summary>
        /// <param name="sealedMessage">The SMD, SMR, SIMD or TRD SealedMessageType instance to create a transport response for.</param>
        /// <param name="sourceOrganisation">The organisation generating the response.</param>
        /// <param name="deliveryResponseClass">The type of response.</param>
        /// <param name="deliveryResponseCode">The response code.</param>
        /// <param name="deliveryResponseMessage">Message containing more details on the response.</param>
        /// <param name="transportResponseTime">The time of the response.</param>
        /// <param name="responseId">A unique ID to identify the response.</param>
        /// <param name="isFinal">A value to indicate if the transport response is the final response.</param>
        /// <param name="otherTransportMetadata">Additional metadata to be included.</param>
        /// <param name="payloadDecryptionCertificate">The certificate to decrypt the sealed message encrypted payload with (the digest value of the message is obtained from the decrypted payload).</param>
        /// <returns>The TransportResponseType instance.</returns>
        public static TransportResponseType GetTransportResponse(
            CommonSealedMessageType sealedMessage,
            string sourceOrganisation,
            ResponseClassType deliveryResponseClass,
            string deliveryResponseCode,
            string deliveryResponseMessage,
            DateTime transportResponseTime,
            string responseId,
            bool isFinal,
            List <OtherTransportMetadataEntryType> otherTransportMetadata,
            X509Certificate2 payloadDecryptionCertificate)
        {
            // Validate sealedMessage
            Validation.ValidateArgumentRequired("sealedMessage", sealedMessage);
            Validation.ValidateArgumentRequired("sealedMessage.EncryptedPayload", sealedMessage.EncryptedPayload);
            Validation.ValidateArgumentRequired("sealedMessage.InvocationId", sealedMessage.InvocationId);
            Validation.ValidateArgumentRequired("sealedMessage.ReceiverOrganisation", sealedMessage.ReceiverOrganisation);
            Validation.ValidateArgumentRequired("sealedMessage.SenderOrganisation", sealedMessage.SenderOrganisation);
            Validation.ValidateArgumentRequired("sealedMessage.ServiceCategory", sealedMessage.ServiceCategory);

            Validation.ValidateArgumentRequired("sourceOrganisation", sourceOrganisation);
            Validation.ValidateArgumentRequired("deliveryResponseCode", deliveryResponseCode);
            Validation.ValidateArgumentRequired("deliveryResponseMessage", deliveryResponseMessage);
            Validation.ValidateArgumentRequired("responseId", responseId);

            Validation.ValidateArgumentRequired("payloadDecryptionCertificate", payloadDecryptionCertificate);

            // deliveryResponseClass isn't validated as it is an enum and there is no option to omit it.

            TransportResponseType tr = new TransportResponseType();

            tr.deliveryResponse = new DeliveryResponseType();

            tr.deliveryResponse.responseClass = deliveryResponseClass;
            tr.deliveryResponse.responseCode  = deliveryResponseCode;
            tr.deliveryResponse.message       = deliveryResponseMessage;
            tr.final = isFinal;

            if (deliveryResponseClass == ResponseClassType.Success)
            {
                XmlDocument    encryptedPayload = sealedMessage.EncryptedPayload.SerializeToXml("encryptedPayload");
                XmlDocument    signedPayload    = encryptedPayload.XspDecrypt(payloadDecryptionCertificate);
                IList <byte[]> digestValues     = signedPayload.XspGetDigestValues();

                tr.deliveryResponse.digestValue = digestValues[0];
            }

            tr.metadata = new TransportResponseMetadataType();
            tr.metadata.transportResponseTime = transportResponseTime.ToUniversalTime();
            tr.metadata.responseId            = responseId;
            tr.metadata.sourceOrganisation    = sourceOrganisation;
            tr.metadata.serviceCategory       = sealedMessage.ServiceCategory;
            tr.metadata.invocationId          = sealedMessage.InvocationId;
            tr.metadata.receiverOrganisation  = sealedMessage.ReceiverOrganisation;
            tr.metadata.senderOrganisation    = sealedMessage.SenderOrganisation;

            if (otherTransportMetadata != null && otherTransportMetadata.Count > 0)
            {
                tr.metadata.otherTransportMetadata = otherTransportMetadata.ToArray();
            }

            return(tr);
        }
Example #4
0
 /// <summary>
 /// Hat der <see cref="TransportResponseType"/> Fehlerkennzeichen?
 /// </summary>
 /// <param name="response">Der zu überprüfende <see cref="TransportResponseType"/></param>
 /// <returns><code>true</code> wenn der <paramref name="response"/> Fehlerkennzeichen enthält</returns>
 public static bool HasErrors(this TransportResponseType response)
 {
     return(GetErrors(response).Any());
 }
Example #5
0
 /// <summary>
 /// Ermittlung aller Fehler für den <see cref="TransportResponseType"/>
 /// </summary>
 /// <param name="response">Der <see cref="TransportResponseType"/> für den die Fehlerkennzeichen ermittelt werden</param>
 /// <returns>Die ermittelten Fehlerkennzeichen</returns>
 public static IEnumerable <FlagType> GetErrors(this TransportResponseType response)
 {
     return(GetReportFlags(response).Where(IsError));
 }
Example #6
0
 /// <summary>
 /// Entschlüsselung der Paket-Daten, die von <see cref="ExecuteQuery(CancellationToken, string)"/> zurückgeliefert werden
 /// </summary>
 /// <param name="response">Die Rückmeldung von <see cref="ExecuteQuery(CancellationToken, string)"/></param>
 /// <returns>Die in <paramref name="response"/> gefundenen eXTra-Pakete</returns>
 public IReadOnlyCollection <PackageInfo> DecryptPackages(TransportResponseType response)
 {
     return(DecodePackages(response.TransportBody?.Items?.Cast <PackageResponseType>()));
 }