Завершенное событие не запускается на WCF только в одном методе, который возвращает неровный массив - PullRequest
1 голос
/ 01 августа 2011

Я использую метод внешнего веб-сервиса с моего веб-сайта в приложении Silverlight. который должен возвращать детали моих видео в базе данных в виде зубчатого массива. Там не должно быть никаких проблем, как я знаю.

Но любой другой метод в том же сервисе запускает завершенные события вместо этого, я также смотрел на его возвращаемое значение и его работу, как я хочу. Что я здесь не так делаю?

Вот мой веб-сервис wcf, размещенный на моем сайте;

[OperationContract]
public Object[][] compilationRequestsDetails(string ownerId, string senderId)
{
    SqlConnection objConnection = new SqlConnection();
    objConnection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnStr"].ToString();
    objConnection.Open();

    SqlDataAdapter adapter = new SqlDataAdapter();
    SqlCommand objCommand = new SqlCommand("SELECT video.id ,name, vidLength, lowPath, instruments.logo, mp3Path FROM video LEFT JOIN instruments ON video.instrumentId = instruments.id LEFT JOIN compilations ON video.compilationId = compilations.id \n"
    +"WHERE video.id='"+ownerId+"' OR video.id='"+senderId+"' OR compilationId ='" +ownerId+"'");

    adapter.SelectCommand = objCommand;
    adapter.SelectCommand.Connection = objConnection;
    SqlDataReader reader = adapter.SelectCommand.ExecuteReader();

    List<Object[]> videos = new List<Object[]>();
    while (reader.Read())
    {
        Object[] values = new Object[reader.FieldCount];
        reader.GetValues(values);
        videos.Add(values);
    }
    Object[][] result = videos.ToArray();

    reader.Close();
    objConnection.Close();

    return result;
}

возвращается как ожидалось; debugging the result value


Редактировать: Благодаря carlosfigueira я обновил свой сервисный звонок следующим образом и обнаружил, что я не получаю данных в приложении silverlight.

        myServiceRef.compilationRequestsDetailsCompleted +=new EventHandler<myService.compilationRequestsDetailsCompletedEventArgs>(myServiceRef_compilationRequestsDetailsCompleted);
    }


    void myServiceRef_compilationRequestsDetailsCompleted(object sender, myService.compilationRequestsDetailsCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            MessageBox.Show("fetch ended result count:" + e.Result.Length);
        }
        else
        {
            MessageBox.Show("Error: " + e.Error);
        }

и ошибка, которую он мне дает, такова;

error

моя эталонная конфигурация для System.Array, и ее должно быть достаточно для типа возврата Object[][].

Буду признателен, если вы скажете мне, почему я не получаю данные.


Проблема должна заключаться в инициализации зубчатого массива, потому что, если я напишу фиктивный массив, подобный этому, и инициализирую следующим образом, я смогу получить данные из Silverlight таким же способом;

    objConnection.Close();

    Object[][] j2 = new Object[][] 
    {
        new Object[] {0,2,4,6},
        new Object[] {11,22}
    };

    return j2;

но так и не смог найти способ правильно передать мой массив результатов в приложение.


Я решил это таким способом, который мне не очень понравился, но это сделано! Я скачал fiddler, и на стороне клиента возникла проблема с типом. Как сказала Карлосфигейра, это была проблема с systemknowntype, поэтому мне нужно было преобразовать значения в строку перед отправкой в ​​приложение.

Спасибо за помощь!

1 Ответ

2 голосов
/ 01 августа 2011

Событие, скорее всего, запускается, но если у вас есть ошибка, вы не можете получить доступ к e.Result, так как оно вызовет исключение. Замените код обработчика событий на

void myServiceRef_compilationRequestsDetailsCompleted(
    object sender, myService.compilationRequestsDetailsCompletedEventArgs e)
{
    if (e.Error == null)
    {
        MessageBox.Show("fetch ended result count:" + e.Result.Length);
    }
    else
    {
        MessageBox.Show("Error: " + e.Error);
    }
}

Теперь, если у вас действительно есть ошибка, вам нужно выяснить, почему она у вас есть. Не глядя на код, одна вещь, которая появляется, состоит в том, что ваша операция объявлена ​​как возвращающая объект [] [], а с WCF вам обычно нужно объявлять все типы, которые будут использоваться с ServiceKnownType. Но лучший способ выяснить фактическую ошибку - включить трассировку на стороне сервера, трассировки должны содержать информацию о самой ошибке.

...