Exemplo n.º 1
0
        /// <summary>
        /// Hämtar pågående driftavbrott på de kanaler som anges. Om något
        /// annat fel inträffar kastas ett ApplicationException.
        /// </summary>
        /// <param name="kanaler">Samling kanaler vars driftavbrott ska hämtas</param>
        /// <returns>Ska endast returnera noll eller ett driftavbrott i praktiken</returns>
        /// <exception cref="ApplicationException"></exception>
        public IEnumerable <driftavbrottType> GetPagaendeDriftavbrott(IEnumerable <String> kanaler)
        {
            if (senastFråganTillDriftavbrott < DateTime.Now)
            {
                #region Bygg frågan och klient

                // Använder ett tredjeparts-lib för att snyggt bygga en URI
                FluentUriBuilder builder = FluentUriBuilder.Create()
                                           .Scheme(myHttps ? UriScheme.Https : UriScheme.Http)
                                           .Host(myServer)
                                           .Port(myPort)
                                           .Path(BASE_URI + PÅGÅENDE_PATH);

                foreach (var kanal in kanaler)
                {
                    builder = builder.QueryParam(KANAL_PARAM, kanal);
                }

                // Släng in systemId som parameter till tjänsten, som alltid är ett krav
                builder = builder.QueryParam(SYSTEM_PARAM, mySystemId);

                // REST client
                RestClient restClient = new RestClient
                {
                    // BaseUrl (REST Service EndPoint adress)
                    BaseUrl  = builder.ToUri(),
                    Encoding = Encoding.UTF8
                };

                // Request som skickas
                RestRequest restRequest = new RestRequest
                {
                    // Metod (POST, GET, PUT, DELETE)
                    // RequestFormat (XML, JSON)
                    Method        = Method.GET,
                    RequestFormat = DataFormat.Xml
                };

                // Lägg till Header (endast XML accepteras)
                restRequest.AddHeader("Accept", "application/xml,application/json");

                #endregion

                // Gör anropet
                IRestResponse <driftavbrottType> restResponse = restClient.Execute <driftavbrottType>(restRequest);

                // Fick vi något svar alls?
                if (restResponse != null)
                {
                    if (restResponse.IsSuccessful)
                    {
                        // Sätter tidpunkten för senaste frågan.
                        senastFråganTillDriftavbrott = DateTime.Now.AddMinutes(1);

                        // Hämta HTTP statuskoden i numerisk form (ex: 200)
                        Int32 numericStatusCode = (Int32)restResponse.StatusCode;

                        // Servern returnerade 404 eller 406 (HTTP Statuskod=404)
                        if (restResponse.StatusCode == HttpStatusCode.NotFound)
                        {
                            throw new ApplicationException($"#Driftavbrottstjänsten returnerade 404/406. ResponseCode={numericStatusCode} {restResponse.StatusCode}, ResponseServer={restResponse.Server}, RequestBaseUrl={restClient.BaseHost}{restClient.BaseUrl}.", new HttpException(404, "File Not Found"));
                        }

                        // Servern returnerade inga driftavbrott alls (HTTP Statuskod=204, innehåll saknas)
                        if (restResponse.StatusCode == HttpStatusCode.NoContent)
                        {
                            gällandeSvarFrånDriftavbrott = Enumerable.Empty <driftavbrottType>();
                            return(gällandeSvarFrånDriftavbrott);
                        }
                        // Servern returnerade eventuella driftavbrott (HTTP Statuskod=200)
                        if (restResponse.StatusCode == HttpStatusCode.OK)
                        {
                            // Sätter gällande svar till svar eller tomt om vi inte fick någon data.
                            gällandeSvarFrånDriftavbrott = restResponse.Data == null?Enumerable.Empty <driftavbrottType>() : new[] { restResponse.Data };
                            return(gällandeSvarFrånDriftavbrott);
                        }
                        // Servern returnerade någon form av annan statuskod som ej behandlas specifikt
                        throw new ApplicationException($"#Driftavbrottstjänsten returnerade en oväntad statuskod. ResponseCode={numericStatusCode} {restResponse.StatusCode}, ResponseServer={restResponse.Server}, RequestBaseUrl={restClient.BaseHost}{restClient.BaseUrl}.");
                    }
                    throw new ApplicationException($"Driftavbrottstjänsten svarar inte. ResponseServer={restResponse.Server}, RequestBaseUrl={restClient.BaseHost}{restClient.BaseUrl}.");
                }

                // Servern returnerade inget svar (Response) alls
                throw new ApplicationException($"#Fick inget svar från driftavbrottstjänsten. RequestBaseUrl={restClient.BaseHost}{restClient.BaseUrl}.");
            }
            // returnerar senaste svaret.
            return(gällandeSvarFrånDriftavbrott);
        }