/// <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")); }
/// <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); }
/// <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()); }
/// <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)); }
/// <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>())); }