Ссылка на объект не указывает на экземпляр объекта - веб-сервисы

У меня эта ошибка появляется в моем веб-сервисе, и хотя я просмотрел статьи по нулевой проблеме, я не могу найти, как исправить эту ошибку.

это мой код:

    SendInvUpdate.InvServices.UpdateRatePackagesRequest urq = new SendInvUpdate.InvServices.UpdateRatePackagesRequest();
    SendInvUpdate.InvServices.UpdateRatePackagesOperationResponse ors = new SendInvUpdate.InvServices.UpdateRatePackagesOperationResponse();


    protected void Page_Load(object sender, EventArgs e)
    {
        Int64 HID = 819942;
        Int64 HRID = 154482;

        SendInvUpdate.InvServices.UpdateRatePackagesRequest request = new SendInvUpdate.InvServices.UpdateRatePackagesRequest();

        ChannelManagerAccount account = new ChannelManagerAccount();
        request.HotelId = HID;

        int avail = 4;
        DateTime frodte = Convert.ToDateTime("2012-04-12");
        DateTime todte = Convert.ToDateTime("2012-04-30");
        int NoofRatePackages = 3;
        UpdateRatePackageRequest[] RatePackages = new UpdateRatePackageRequest[NoofRatePackages];
        string res;
        request.RatePackages = new UpdateRatePackageRequest[NoofRatePackages];
        request.RatePackages = RatePackages;

        UpdateRatePackageRequest rp = new UpdateRatePackageRequest();

        for (int i = 0; i < NoofRatePackages; i++)
        {        
            rp.RatePackageId = HRID;        

            RateDetails[] Rates = new RateDetails[NoofRatePackages];

            rp.Rates = new RateDetails[NoofRatePackages];
            rp.Rates = Rates;

            RateDetails rd = new RateDetails();

            for (int j = 0; j < NoofRatePackages; j++)
            {
                rd.Availability = avail;

                rd.AvailabilityApplicationType = SendInvUpdate.InvServices.AvailabilityApplicationType.SET;

                rd.FromDate = frodte;

                rd.ToDate = todte;

            }

        }

       SendInvUpdate.InvServices.InventoryServiceClient icc = new SendInvUpdate.InvServices.InventoryServiceClient();            
        // ( *Line where the error appears*)
        ors = icc.UpdateRatePackages(request); 

        res = ors.Results.ToString();          
    }

Я знаю, что это как-то связано с массивом RateDetails и инициализацией значения RateDetails в этот момент запроса, но я не уверен, как и что с этим делать. В режиме отладки при просмотре значений rp отсутствуют значения для rp.Rates[0],rp.Rates[1],rp.Rates[2], а также RatePackages[0],RatePackages[1],RatePackages[2] также null, поэтому у меня есть сильное ощущение, что это моя проблема, но я понятия не имею, как ее исправить.

Буду признателен за любое понимание того, где я ошибся!


person user1270384    schedule 10.04.2012    source источник
comment
Где определяется ores?   -  person Bryan Crosby    schedule 11.04.2012
comment
Спасибо за это, я отредактировал, должен быть определен сверху с новым экземпляром моего веб-сервиса.   -  person user1270384    schedule 11.04.2012


Ответы (1)


Переместите инициализацию ссылки на службу icc внутри вашего кода page_load как

SendInvUpdate.InvServices.InventoryServiceClient icc = new SendInvUpdate.InvServices.InventoryServiceClient(); 
ors = icc.UpdateRatePackages(request); ( Line where the error appears)

Я не эксперт в asp.net, но вы не можете основывать свой код на глобальных переменных, если не сохраняете их в каком-либо постоянном контейнере (ищите SESSION, VIEWSTATE)

РЕДАКТИРОВАТЬ: здесь тоже что-то не так

   UpdateRatePackageRequest[] RatePackages = new UpdateRatePackageRequest[NoofRatePackages]; 
   string res; 
   request.RatePackages = new UpdateRatePackageRequest[NoofRatePackages]; 
   request.RatePackages = RatePackages; 

должно быть только request.RatePackages = new UpdateRatePackageRequest[NoofRatePackages]; ?

EDIT2: вы отправляете InventoryServiceClient объект request, который содержит массив UpdateRatePackageRequest, но после создания массива вы не устанавливаете экземпляр UpdateRatePackageRequest. Поэтому я предполагаю, что InventoryServiceClient терпит неудачу при чтении значений из массива. Я попытаюсь изменить ваш цикл for таким образом

   for (int i = 0; i < NoofRatePackages; i++)       
   {               
        UpdateRatePackageRequest rp = new UpdateRatePackageRequest(); 
        request.RatePackages[i] = rp;
        ....

Та же ошибка с RateDetails. Вы создаете массив, но не устанавливаете какое-либо значение вашего массива с фактическим экземпляром RateDetails.

        for (int j = 0; j < NoofRatePackages; j++) 
        { 
            RateDetails rd = new RateDetails();  
            rp.Rates[j] = rd;
            ....
person Steve    schedule 10.04.2012
comment
Спасибо за это, это не сработало, я отредактировал код, чтобы показать, как он выглядит после вашего предложения. - person user1270384; 11.04.2012
comment
Я ожидаю, что если вы установите точку останова на проблемной строке и проверите переменные request и icc, вы увидите, что они не равны нулю. Итак, если вы выполняете строку и ваш код прерывается с необработанным исключением, это означает, что ошибка является внутренней для метода веб-сервиса UpdateRatePackages. - person Steve; 11.04.2012
comment
Спасибо @steve. Я установил точку останова и обнаружил, что нет нулей, а также пересмотрел свой вопрос, надеясь, что он прояснит мою проблему для всех. - person user1270384; 11.04.2012
comment
Я получил это из одного из примеров массивов в веб-сервисах в одном из вопросов, заданных на этом сайте на прошлой неделе, но сейчас у меня нет ссылки. Он отлично работает, потому что я могу получить значение для rp.RatePackageId = HRID; как 154482. Именно после того, как я вызываю экземпляр RateDetails, я получаю нули. - person user1270384; 11.04.2012