Недавняя модификация в Twitter API? - PullRequest
1 голос
/ 21 января 2011

Я написал очень простое приложение на C # для отправки твитов между компьютерами с Windows.Для этого каждая конечная точка (т. Е. Это настольное приложение на C # .NET, использующее библиотеку TweetSharp) имеет таймер, и при возникновении события Elapsed все сообщения собираются вместе с вызовом GetDirectMessages (), а затем эти сообщения анализируются и обрабатываютсяконечная точка.

Моя проблема в том, что я построил это за несколько часов две недели назад, и все работало нормально.Я отряхнул его и казнил неделю назад, без проблем.Теперь я разбил его сегодня и получаю очень странное исключение (смотрите раздел ИСКЛЮЧЕНИЕ), которое возникает в строке "IEnumerable directMessage = service.ListDirectMessagesReceived ();"(см. раздел ИСТОЧНИК).Мой вопрос заключается в том, что, поскольку мой код не изменился, возможно ли, что API изменился (я знаю, что знаю, что это невероятно маловероятно).Есть ли у кого-нибудь из высокопоставленных и эрудированных членов StackO какие-либо мысли?

Кстати, я проверил, и мой ConsumerKey / Secret действителен, так же как и кэшированный токен доступа OAuth, который использует мой раздел аутентификации.Это странно, потому что я могу вытащить свой список подписчиков, проверить свою статистику ограничения скорости и т. Д. Также мои ссылки на NewtonSoft, Hammoch и TweetSharp не были обновлены / изменены.

Спасибо.

[SOURCE]

    private struct message
    {
        public long id;
        public string text;

        public message(long i, string t)
        {
            id = i;
            text = t;
        }
    }    

    private MessageEngine
    {
        /* Do auth -- excised for obvious reasons */

        Timer timer = new Timer();
        timer.Interval = 15000;
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();
    }    

    private List<message> GetDirectMessages()
    {
        try
        {
            //Declarations:
            message message = new message();
            List<message> messages = new List<message>();
/*line 344*/IEnumerable<TwitterDirectMessage> directMessages = service.ListDirectMessagesReceived();

            //Fetch all current direct message:
            foreach (TwitterDirectMessage directMessage in directMessages)
            {
                //Store each message into a list, in reverse older:
                message = new message(directMessage.Id, directMessage.Text);
                messages.Insert(0, message);
            }

            return messages;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return null;
        }
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        try
        {
            List<message> messages = GetDirectMessages();
            LocalExecute(messages);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

    private bool LocalExecute(List<message> messages)
    {
        /* process messages */
    }

[ИСКЛЮЧЕНИЕ]

Newtonsoft.Json.JsonSerializationException: Cannot deserialize JSON array into type 'TweetSharp.TwitterDirectMessage'.
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(Type objectType, JsonContract contract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 412
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String reference) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 432
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 222
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueNonProperty(JsonReader reader, Type objectType, JsonContract contract) in d:\Development\Releases\Json\Working\Src\Newtonsoft.Json\Serialization\JsonSerializerInternalReader.cs:line 205
   at TweetSharp.Serialization.SerializerBase.DeserializeJson(String content, Type type) in C:\Users\Dimebrain\Desktop\Src\tweetsharp\src\vs2010\TweetSharp.Next\Serialization\SerializerBase.cs:line 60
   at TweetSharp.Serialization.JsonSerializer.AddDeserializedItem(String c, Type type, IList collection) in C:\Users\Dimebrain\Desktop\Src\tweetsharp\src\vs2010\TweetSharp.Next\Serialization\JsonSerializer.cs:line 131
   at TweetSharp.Serialization.JsonSerializer.DeserializeCollection[T](String content) in C:\Users\Dimebrain\Desktop\Src\tweetsharp\src\vs2010\TweetSharp.Next\Serialization\JsonSerializer.cs:line 90
   at TweetSharp.Serialization.JsonSerializer.Deserialize[T](String content) in C:\Users\Dimebrain\Desktop\Src\tweetsharp\src\vs2010\TweetSharp.Next\Serialization\JsonSerializer.cs:line 17
   at Hammock.RestClient.DeserializeEntityBody[T](RestBase request, RestResponse`1 response) in C:\Users\Dimebrain\Desktop\Src\hammock\src\net35\Hammock\RestClient.cs:line 2285
   at Hammock.RestClient.BuildResponseFromResult[T](RestBase request, WebQuery query) in C:\Users\Dimebrain\Desktop\Src\hammock\src\net35\Hammock\RestClient.cs:line 2212
   at Hammock.RestClient.Request[T](RestRequest request) in C:\Users\Dimebrain\Desktop\Src\hammock\src\net35\Hammock\RestClient.cs:line 107
   at TweetSharp.TwitterService.WithHammockImpl[T](RestRequest request) in C:\Users\Dimebrain\Desktop\Src\tweetsharp\src\vs2010\TweetSharp.Next\Service\TwitterService.cs:line 401
   at TweetSharp.TwitterService.WithHammock[T](String path) in C:\Users\Dimebrain\Desktop\Src\tweetsharp\src\vs2010\TweetSharp.Next\Service\TwitterService.cs:line 378
   at TweetSharp.TwitterService.WithHammock[T](String path, Object[] segments) in C:\Users\Dimebrain\Desktop\Src\tweetsharp\src\vs2010\TweetSharp.Next\Service\TwitterService.cs:line 383
   at TweetSharp_Test.Form1.GetDirectMessages() in C:\Users\kmarks2\Documents\Visual Studio 2008\Projects\TweetSharp_Test\TweetSharp_Test\Form1.cs:line 344

1 Ответ

2 голосов
/ 22 января 2011

Как видно из трассировки стека, схема класса TweetSharp.TwitterDirectMessage отличается от ожидаемой Deserializer, возможно, передаваемые данные Json изменились с момента последней проверки.

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

Когда я зарегистрировался в changeset на codeplex, произошло изменение, чтобы исправить прямые сообщения с идентификаторами, используя свободный.

Проверьте это здесь.

http://tweetsharp.codeplex.com/SourceControl/changeset/changes/8bf46a5230bc

Попробуйте загрузить новую TweetSharp v2.0.0.0 - Preview 9

...