Пропущен метод веб-службы?

#c# #asp.net #web-services

#c# #asp.net #веб-службы

Вопрос:

Я использую ASP.NET приложение с веб-службой, и по какой-то причине один из методов веб-службы пропускается. Я уверен, что это довольно простая проблема, но она поставила меня в тупик более чем на день. Я помещаю вызов метода в неправильный метод, я бы предположил, что OnPreRender обработает все до завершения загрузки страницы. Я довольно уверен, что проблема в этой области, если я установлю для ImageLoc объекта формы URL-адрес, когда он создается, он загружается в ASP.NET страница в порядке.

Я не думаю, что я пропустил какой-либо соответствующий код, но если вам нужно увидеть что-нибудь еще, дайте мне знать. Объект form — это всего лишь несколько свойств с get / set, поэтому я его опустил. Также, пожалуйста, обратите внимание, что строковые параметры будут изменены на что-то другое, я просто пытаюсь настроить основную работу.

.aspx.cs :

      localhost.MobileFormServices wsMobile = new localhost.MobileFormServices();

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);
        //Call the web service to pass image URL 
        wsMobile.NewForm("parameters");
        FormImage.ImageUrl = wsMobile.FormProperties().ImageLoc;
    }
  

методы веб-службы:

    //new form object instance
    private FormLibrary.Form form = new FormLibrary.Form();

    //adds the image location to the form object
    [WebMethod]
    public void NewForm(String parameters)
    {
        form.ImageLoc = "http://www.prelovac.com/vladimir/wp-content/uploads/2008/03/example.jpg"; //breakpoint here, never hit
    }

   [WebMethod]
    public FormLibrary.Form FormProperties() 
    {
        return this.form;
    }
  

Ответ №1:

Вы уверены, что веб-служба не вызывается? Вызов

 FormImage.ImageUrl = wsMobile.FormProperties().ImageLoc;
  

хотя на вашей странице используется тот же экземпляр объекта, на стороне веб-службы вызывается совершенно другой экземпляр, чем при использовании метода

  wsMobile.NewForm("parameters");
  

был вызван. Из-за этого

 private FormLibrary.Form form = new FormLibrary.Form();
  

вызывается при каждом вызове веб-службы.

При каждом вызове веб-службы создается новый экземпляр веб-службы, обрабатывающей вызов. Итак, в вашем примере.

  1. wsMobile.NewForm(«параметры») — новая библиотека FormLibrary.Форма создается при создании экземпляра, обрабатывающего этот вызов.

  2. в этом вызове вы задаете форму.ImageLoc — но эта форма локальна для этого экземпляра

  3. FormImage.ImageUrl = wsMobile.FormProperties().ImageLoc; — снова новая библиотека FormLibrary.Форма создается, например, для обработки этого вызова

  4. вы возвращаете ImageLoc новой созданной FormLibrary.Form. Не то, что вы установили ранее.

Комментарии:

1. Для меня это имеет смысл, но как бы вы порекомендовали это исправить?

2. Я немного подумал, будет ли передача объекта формы в asp.net приложение, использующее / модифицирующее его, а затем передающее его обратно через веб-службу, устраняет это? Я собираюсь попробовать это сейчас.

3. Вы можете сохранить FormLibrary. Форма как статическая, но это приведет к тому, что все страницы будут иметь одинаковую форму, что, вероятно, плохо, но зависит от каждого проекта. Другой способ — сохранить его в сеансе или в каком-либо внешнем хранилище, таком как база данных. Или, если вы действительно используете два вызова в своем приложении, может быть, вам следует сделать это одним? В этом примере второй вызов не имеет смысла. Первый вызов должен вернуть то, что вам нужно. Если вы считаете этот ответ полезным, пожалуйста, поддержите 🙂

Ответ №2:

Можете ли вы попробовать использовать событие OnPreRenderComplete вместо OnPreRender.

Комментарии:

1. Пробовал это, возникла та же проблема.

Ответ №3:

Иногда отладчик путается. Попробуйте это (и выполните перестройку всего):

 [WebMethod]
public void NewForm(String parameters)
{
    System.Diagnostics.Debugger.Break();
    form.ImageLoc = "http://www.prelovac.com/vladimir/wp-content/uploads/2008/03/example.jpg"; //breakpoint here, never hit
}
  

Комментарии:

1. Все еще не доходит до here, так что это означает, что он определенно не вызывается?

2. Вы получаете сообщение об ошибке? Вы убедитесь, что IIS выключен и перезапущен (или что это вообще за сервер) между тестами? Попробуйте удалить и повторно добавить прокси.

3. Сообщения об ошибке нет, в основном я собираюсь использовать веб-службу для доступа к некоторым изображениям, сгенерированным другой программой (еще не созданным, поэтому я использую случайное изображение). Я пытаюсь передать это изображение в мой asp.net приложение для его отображения. Я попытался перезапустить сервер, который я использую. Вы имеете в виду прокси-класс? Я тоже пробовал это. Я немного почитал и подумал, что это, возможно, проблема с синтаксическим анализом xml, возникающая при передаче объектов из веб-сервисов, но решение для этого ничего не изменило для меня (удаление класса form в прокси и добавление с помощью FormLibrary)

Ответ №4:

Попробуйте переместить свой код OnPreRender () в OnInit().

Комментарии:

1. Изменений нет, по-прежнему пропускается точка останова и выполняется не так, как ожидалось.

2. Почему это должно что-то изменить?