Why am I getting a 404 error when deploying my C# Razor report to IIS 7 in production?

125 Views Asked by At

C# .Net Core Razor Drill Down Report Navigation Issue in Production IIS

I have written a C# razor page financial report which allows the user to drill down into the details of of any line item on the report. The razor report uses the NavManager to recursively calls the page to expand the item details. I am using NavManager.NavigateTo() for the recursive call. Everything works fine in development but I get a 404 error "The Resource you are looking for has been removed" when is is deplyed to the IIS staging environment. Does anyone know a solution for this issue?

DrillDown.razor

@page "/SummaryDrillDown/{dataOption}/{dataoptionfilter}/{periodtype}/{periods}/{fiscalyear}/{customerfilter}"

@if (loading)
{
    <Spinner />
}
else
{
    @foreach (InvoiceHistorySummaryReportHeading aReportHeading in lstInvoiceHistorySummaryReportHeading)
    {
        <div class="container">
            <div class="row">
                <div class="col-1"></div>
                <div class="col-5">@lblHeading1</div>
                <div class="col-6">
                    <h4>@aReportHeading.Heading1</h4>
                </div>
            </div>


            @*Create a filtered list of summary items*@
            @{
                lstInvoiceHistorySummaryReportBody = lstInvoiceHistorySummaryReport.Select(InvoiceHistorySummaryReport => InvoiceHistorySummaryReport)
                .Where(w => w.heading1 == aReportHeading.Heading1)
                .ToList();
            }

            <div class="container">
                <div class="row bg-disaPurple text-white">
                    <div class="col-1">@lblColumn1</div>
                    <div class="col-4">@lblColumn2</div>
                    <div class="col-2"><span class="float-end">@lblColumn3</span></div>
                    <div class="col-2"><span class="float-end">@lblColumn4</span></div>
                    <div class="col-1"></div>
                </div>
                @foreach (InvoiceHistorySummaryReport aReportBody in lstInvoiceHistorySummaryReportBody)
                {
                    <div class="row">
                        <div class="col-1">@aReportBody.column1</div>
                        <div class="col-4">@aReportBody.column2</div>
                        <div class="col-2 float-end"><span class="float-end">@Convert.ToDecimal(aReportBody.PeriodTotal).ToString("C2")</span></div>
                        <div class="col-2 float-end"><span class="float-end">@Convert.ToDecimal(aReportBody.YtdTotal).ToString("C2")</span></div>
                        <div class="col-1 p-0">
                            <button class="btn btn-primary rounded m-1 py-0 px-1" @onclick="() => GetDetails(aReportHeading.Heading1, aReportHeading.Heading2, aReportBody.column1,aReportBody.column2)">View Details</button>
                        </div>
                    </div>
                    SubTotal1 = SubTotal1 + Convert.ToDouble(aReportBody.PeriodTotal);
                    SubTotal2 = SubTotal2 + Convert.ToDouble(aReportBody.YtdTotal);
                }
                <div class="row bg-disaPurple text-white">
                    <div class="col-1"></div>
                    <div class="col-4"><span class="float-end">Total Invoices</span></div>
                    <div class="col-2"><span class="float-end">@SubTotal1.ToString("C2")</span></div>
                    <div class="col-2"><span class="float-end">@SubTotal2.ToString("C2")</span></div>
                    <div class="col-1"></div>
                </div>
            </div>
        </div>
        <br />
        <br />
    }
    <hr />
    <br />
}

DrillDown.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Diagnostics;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Options;
using XZY_2.Data.Repositories.Interfaces;
using XZY_2.Data.DataModels;
using XZY_2.Helpers.Interfaces;
using XZY_2.Shared;
using XZY_2.Helpers;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;
using Dapper;
using XZY_2.Data.Repositories;

namespace XZY_2.Pages
{
    public partial class SummaryDrillDown
    {
        // page url: "/SummaryDrillDown/{dataoption}/{dataoptionfilter}/{periodtype}/{periods}/{fiscalyear}/{customerfilter}"
        [CascadingParameter(Name = "SessionKey")] string aSessionKey { get; set; }

        [Parameter]
        public string DataOption { get; set; }
        [Parameter]
        public string DataOptionFilter { get; set; }
        [Parameter]
        public string PeriodType { get; set; }
        [Parameter]
        public string Periods { get; set; }
        [Parameter]
        public string FiscalYear { get; set; }
        [Parameter]
        public string CustomerFilter { get; set; }

        [Inject]
        ISessionService SessionService { get; set; }
        [Inject]
        private ILogger<SearchParameters> Logger { get; set; }
        [Inject]
        private NavigationManager NavManager { get; set; }
        [Inject]
        private IServiceProviderRepository ServiceProviderRepository { get; set; }
        [Inject]
        private IOptions<CisSettings> CisSettings { get; set; }

        private ISearchParameters searchParameters;

        private List<InvoiceHistorySummaryReport> lstInvoiceHistorySummaryReport = new();
        private List<InvoiceHistorySummaryReportHeading> lstInvoiceHistorySummaryReportHeading = new();
        private List<InvoiceHistorySummaryReport> lstInvoiceHistorySummaryReportBody = new();

        private bool loading = true;
        private string uics;
        private List<string> periods = new();

        ////// Ststic Report Labels
        private string lblHeading1 = string.Empty;
        private string lblColumn1 = string.Empty;
        private string lblColumn2 = string.Empty;
        private string lblColumn3 = string.Empty;
        private string lblColumn4 = string.Empty;

        // Lists for repeating report elements
        private List<InvoiceCharge> reportchargeslist = new();
        private List<ReportHeading> reportheadinglist = new();

        // Report Fields
        private string ReportTimeSpan = string.Empty;
        private double SubTotal1 = 0;  // Subtotal Period
        private double SubTotal2 = 0;  // SubTotal YTD

        private string Edipi = string.Empty;
        private string Search = string.Empty;

        protected override void OnInitialized()
        {
            searchParameters = new SearchParameters(Logger);

            // URLDecode Parameters
            DataOption = System.Net.WebUtility.UrlDecode(DataOption);
            DataOptionFilter = System.Net.WebUtility.UrlDecode(DataOptionFilter);
            PeriodType = System.Net.WebUtility.UrlDecode(PeriodType);
            Periods = System.Net.WebUtility.UrlDecode(Periods);
            FiscalYear = System.Net.WebUtility.UrlDecode(FiscalYear);
            CustomerFilter = System.Net.WebUtility.UrlDecode(CustomerFilter);

            try
            {
                searchParameters = SessionService.Restore(aSessionKey);
                if (searchParameters.CheckTimetoLiveExpired()) NavManager.NavigateTo($"LogOut");
            }
            catch (Exception exc)
            {
                Logger.LogWarning("***Session.Restore() failed:" + exc.Message);
            }

            // Get search properties not passed in URL
            Edipi = searchParameters.GetEDIPI();
            Search = searchParameters.GetCIC();

            // For Timespan
            var MonthOptions = CisSettings.Value.MonthOptions;
            var PeriodOptions = CisSettings.Value.PeriodOptions;

            // get list of periods from Periods string
            periods = Periods.Split(',').ToList();
            uics = String.Join(',', CisSettings.Value.Uics);

            // Initialize Report Configurations
            switch (DataOption)
            {
                case "Service Provider":

                    if (CustomerFilter == "OVHD-TEST") initializeSummaryChargesReport1();
                    if (CustomerFilter == "OVHD2") initializeSummaryChargesReport2();
                    if (CustomerFilter == "OVHD3") initializeSummaryChargesReport3();
                    break;

                default:
                    break;
            }

            if (lstInvoiceHistorySummaryReport != null)
            {
                //Create Subreport with two headings
                lstInvoiceHistorySummaryReportHeading = lstInvoiceHistorySummaryReport.Select(InvoiceHistorySummaryReport => InvoiceHistorySummaryReport)
                                 .GroupBy(x => new { x.heading1, x.heading2, x.heading3, x.heading4, x.heading5 })
                                 .OrderBy(g => g.Key.heading1.ToUpperInvariant()).ThenBy(g => g.Key.heading2.ToUpperInvariant())
                                 .Select(g => new InvoiceHistorySummaryReportHeading
                                 {
                                     Heading1 = g.Key.heading1,
                                     Heading2 = g.Key.heading2,
                                     Heading3 = g.Key.heading3,
                                     Heading4 = g.Key.heading4,
                                     Heading5 = g.Key.heading5
                                 })
                                 .ToList();

                // Build a report daterange string for the report header
                if (PeriodType == "Month")
                {
                    string value = MonthOptions.Find(x => x.Value == Periods.ToString()).Text;
                    ReportTimeSpan = value + " " + FiscalYear;
                }
                else
                {
                    string value = PeriodOptions.Find(x => x.Value == Periods.ToString()).Text;
                    ReportTimeSpan = value + ", " + FiscalYear;
                }
            }
            loading = false;
        }

        private void GetDetails(string dataOptionFilter, string customerName, string chargeFilter, string description)
        {
            loading = true;
            // navigate to next page and pass parameters
            Edipi = System.Net.WebUtility.UrlEncode(Edipi);
            CustomerFilter = System.Net.WebUtility.UrlEncode(CustomerFilter);
            FiscalYear = System.Net.WebUtility.UrlEncode(FiscalYear);
            DataOption = System.Net.WebUtility.UrlEncode(DataOption);
            dataOptionFilter = System.Net.WebUtility.UrlEncode(dataOptionFilter);
            chargeFilter = System.Net.WebUtility.UrlEncode(chargeFilter);

            try
            {
                SessionService.Store(aSessionKey, searchParameters);
                Debug.WriteLine("***Session.Store() worked");
            }
            catch (Exception exc)
            {
                Debug.WriteLine("***Session.Store() failed" + exc.Message);
            }

            switch (DataOption)
            {
                case "Service+Provider":
                    if (CustomerFilter == "OVHD-TEST")
                    {
                        CustomerFilter = "OVHD2";
                        NavManager.NavigateTo($"SummaryDrillDown/{DataOption}/{chargeFilter}/{PeriodType}/{Periods}/{FiscalYear}/{CustomerFilter}", true);
                    }
                    else if (CustomerFilter == "OVHD2")
                    {
                        CustomerFilter = "OVHD3";
                        NavManager.NavigateTo($"SummaryDrillDown/{DataOption}/{chargeFilter}/{PeriodType}/{Periods}/{FiscalYear}/{CustomerFilter}", true);
                    }
                    else if (CustomerFilter == "OVHD3")
                    {
                        CustomerFilter = "OVHD4";
                        NavManager.NavigateTo($"SummaryDrillDown/{DataOption}/{chargeFilter}/{PeriodType}/{Periods}/{FiscalYear}/{CustomerFilter}", true);
                    }
                    break;
                default:
                    break;
            }
            loading = false;
        }

        #region Report Initializaers

        private void initializeSummaryChargesReport1()
        {
            lblHeading1 = "Service Provider:";

            lblColumn1 = "Report1";
            lblColumn2 = "Title";
            lblColumn3 = "Period Dollars";
            lblColumn4 = "YTD Dollars";
            Search = DataOptionFilter;
            lstInvoiceHistorySummaryReport = GetSummary(FiscalYear, Periods, DataOptionFilter, uics, Search, Edipi).ToList();
        }

        private void initializeSummaryChargesReport2()
        {
            lblHeading1 = "Service Provider:";
            lblColumn1 = "Report2";
            lblColumn2 = "Title";
            lblColumn3 = "YTD Usage";
            lblColumn4 = "YTD Dollars";

            DataOptionFilter = uics;
            lstInvoiceHistorySummaryReport = GetSummary(FiscalYear, Periods, DataOptionFilter, uics, Search, Edipi).ToList();
        }

        private void initializeSummaryChargesReport3()
        {
            lblHeading1 = "Service Provider:";
            lblColumn1 = "Report3";
            lblColumn2 = "Title";
            lblColumn3 = "YTD Usage";
            lblColumn4 = "YTD Dollars";

            DataOptionFilter = uics;
            lstInvoiceHistorySummaryReport = GetSummary(FiscalYear, Periods, DataOptionFilter, uics, Search, Edipi).ToList();
        }

        private void initializeSummaryChargesReport4()
        {
            lblHeading1 = "Service Provider:";
            lblColumn1 = "Report4";
            lblColumn2 = "Title";
            lblColumn3 = "YTD Usage";
            lblColumn4 = "YTD Dollars";

            DataOptionFilter = uics;
            lstInvoiceHistorySummaryReport = GetSummary(FiscalYear, Periods, DataOptionFilter, uics, Search, Edipi).ToList();
        }

        public IEnumerable<InvoiceHistorySummaryReport> GetSummary(string fiscalYear, string periods, string dataOptionFilter, string uics, string customerFilter, string edipi)
        {
            try
            {
                {
                    IEnumerable<InvoiceHistorySummaryReport> result = ServiceProviderRepository.GetServiceProvider_OVHDCICSummary(FiscalYear, Periods, DataOptionFilter, uics, uics, Edipi).ToList();
                    //IEnumerable<InvoiceHistorySummaryReport> result = new InvoiceHistorySummaryReport[4];
                    return result;
                }
            }
            catch (Exception ex)
            {
                throw new Exception($"GetSummary: {ex.Message}", ex);
            }
        }
        #endregion
    }
}
0

There are 0 best solutions below