Exemple #1
0
        /// <summary>
        /// Lookup SMP (service-metadata) for given participant.
        /// Constructs SMP-url and extracts metadata from SMP (endpointaddress for given participant and receiving-capabilities for that endpoint)
        /// SMP = Service Metadata Provider, See also http://www.peppol.eu/pilot-reporting/infrastructure/post-award-infrastructure-1/smp-providers
        /// </summary>
        /// <param name="participantIdentifier">participant-id, f.eks. 9908:974763907 where 9908 means norway no tax, and 974763907 is org.nr</param>
        /// <returns>Information about the accesspoint for given participant. throws <see cref="SmpLookupException"/> if participant is not found</returns>
        public virtual SmpInformation LookupSMP(string participantIdentifier)
        {
            try
            {
                Log.Info("Start LookupSMP");
                if (string.IsNullOrEmpty(participantIdentifier))
                {
                    throw new ArgumentNullException("participantIdentifier", "cannot be null");
                }

                var helper = new Helper();

                const string businessIdScheme = "iso6523-actorid-upis"; //når vi spør SMP om info MÅ vi bruke denne verdien. Denne betyr at vi bruker en eller annen internasjonal ISO-standard for å definere participant-iden. POLICY 7 XML attributes for Participant Identifiers in BusDox: The “scheme” attribute must be populated with the value "iso6523-actorid-upis" (see POLICY 5) in all instances of the “ParticipantIdentifier” element
                const string documentIdScheme = "busdox-docid-qns";     //denne er alltid fast.. POLICY 10: The PEPPOL document type identifier scheme to be used is: busdox-docid-qns. Applies to: all document type identifiers in all components

                //fungerer: (men då spør vi bare om aksesspunkt som støtter generell type?) Men satser på at det går greit, siden oxalis i hverty fall bare har ett endpoint for alle dokument? trur denne spør om AP godtar fra versjon 1 til 2 og..
                const string documentIdValue = "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2::Invoice##urn:www.cenbii.eu:transaction:biicoretrdm010:ver1.0:#urn:www.peppol.eu:bis:peppol4a:ver1.0::2.0";

                //Participant identifiers – consisting of scheme and value – are encoded as follows into a DNS name: 292 B-<hash-of-value>.<scheme>.<SML-zone-name>
                var smpUrl = helper.BuildSmpUrl(participantIdentifier, businessIdScheme, DefaultSmlDomain);

                try
                {
                    Log.InfoFormat("Contacting SMP URL: {0}", smpUrl);

                    using (var client = new SimpleWebClient())
                    {
                        client.HeadOnly = true;
                        var s1 = client.DownloadString(smpUrl);
                    }

                    Log.Info("SMP OK");
                }
                catch (Exception exception)
                {
                    Log.Error(exception);
                    throw new SmpLookupException(string.Format("Error contacting smpUrl ({0})", smpUrl), smpUrl, exception);
                }

                string endpointAddress;

                try
                {
                    Log.Info("Getting endpointaddres from service metadata..");
                    endpointAddress = helper.GetEndPointAddress(participantIdentifier, businessIdScheme, DefaultSmlDomain, documentIdScheme, documentIdValue);
                    Log.InfoFormat("Endpoint found OK: {0}", endpointAddress);
                }
                catch (Exception exception)
                {
                    Log.Error(exception);
                    throw new SmpLookupException("Error getting endpointaddress from smp: " + exception.Message, smpUrl, exception);
                }

                ServiceGroup serviceGroupElements;

                try
                {
                    Log.Info("Parsing servicegroup-info from smp...");
                    serviceGroupElements = new ServiceGroupParser().GetServiceGroup(smpUrl);
                    Log.Info("Parse OK");
                }
                catch (Exception exception)
                {
                    Log.Error(exception);
                    throw new SmpLookupException("Error getting servicegroups from smp: " + exception.Message, smpUrl, exception);
                }

                var temp = new SmpInformation
                {
                    Address              = endpointAddress,
                    FromSmpUrl           = smpUrl,
                    ServiceGroupElements = serviceGroupElements
                };

                Log.Info("Returning SmpInfo");
                return(temp);
            }
            catch (Exception exception)
            {
                Log.Error(exception);
                throw;
            }
        }