2013-10-30 15 views
17

Wir verwenden TweetSharp (TweetSharp Version = 2.3.1 und Newtonsoft.Json Version = 5.0.6) API, um die Tweets der Benutzer in unserer Webanwendung zu zeigen. Unten ist der Code, die in unserem asp.net Mvc (C#) Anwendung verwenden:Tweetsharp Problem beim Abrufen des UserProfile und TimeLine

var service = new TwitterService("ConsumerKey", "ConsumerKeySecret"); 
service.AuthenticateWith("TwitterToken", "TwitterTokenSecret"); 
TweetSharp.TwitterUser tuSelf = service.GetUserProfile(new GetUserProfileOptions() { IncludeEntities = false, SkipStatus = false }); 
if (tuSelf != null) 
{ 
//Get the User Details 
} 
var tweets = service.ListTweetsOnUserTimeline(new ListTweetsOnUserTimelineOptions { Count = 5 }); 

Wir erhalten die folgende Ausnahme, während die Userprofile erhalten:

System.OverflowException: Value was either too large or too small for an Int32. 

Generated: Wed, 30 Oct 2013 05:48:41 GMT 

System.OverflowException: Value was either too large or too small for an Int32. 
    at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) 
    at Newtonsoft.Json.JsonTextReader.ParseNumber() 
    at Newtonsoft.Json.JsonTextReader.ParseValue() 
    at Newtonsoft.Json.JsonTextReader.ReadInternal() 
    at Newtonsoft.Json.JsonReader.ReadAsInt32Internal() 
    at Newtonsoft.Json.JsonTextReader.ReadAsInt32() 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, Object target) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject(Object newObject, JsonReader reader, JsonObjectContract contract, JsonProperty member, String id) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) 
    at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) 
    at TweetSharp.SerializerBase.DeserializeJson(String content, Type type) 
    at TweetSharp.JsonSerializer.DeserializeJson(String content, Type type) 
    at TweetSharp.JsonSerializer.DeserializeSingle(String content, Type type) 
    at TweetSharp.JsonSerializer.DeserializeContent(String content, Type type) 
    at TweetSharp.JsonSerializer.Deserialize[T](RestResponseBase response) 
    at Hammock.RestClient.DeserializeEntityBody[T](RestRequest request, RestResponse`1 response) 
    at Hammock.RestClient.BuildResponseFromResult[T](RestRequest request, WebQuery query) 
    at Hammock.RestClient.Request[T](RestRequest request) 
    at TweetSharp.TwitterService.WithHammockImpl[T](RestRequest request) 
    at TweetSharp.TwitterService.WithHammock[T](String path) 
    at TweetSharp.TwitterService.WithHammock[T](String path, Object[] segments) 
    at TweetSharp.TwitterService.GetUserProfile(GetUserProfileOptions options) 
    at TweetApp.Web.Controllers.TwitterController.GetFollowersAndTweets(TwitterSettings twitterSettings) 
    at TweetApp.Web.Controllers.TwitterController.ViewTwitter(Nullable`1 Id) 
    at lambda_method(Closure , ControllerBase , Object[]) 
    at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
    at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
    at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.<BeginInvokeAction>b__20() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) 
    at System.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) 
    at System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) 
    at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) 
    at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End() 
    at System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) 
    at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Und die unten stehende Ausnahme beim Abrufen die Timeline Tweets:

Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'TweetSharp.TwitterStatus' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly. To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array. Path '', line 1, position 1. 

Generated: Wed, 30 Oct 2013 04:45:03 GMT 

Newtonsoft.Json.JsonSerializationException: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'TweetSharp.TwitterStatus' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly. 
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array. 
Path '', line 1, position 1. 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureArrayContract(JsonReader reader, Type objectType, JsonContract contract) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue) 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) 
    at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) 
    at TweetSharp.SerializerBase.DeserializeJson(String content, Type type) 
    at TweetSharp.JsonSerializer.DeserializeJson(String content, Type type) 
    at TweetSharp.JsonSerializer.AddDeserializedItem(String c, Type type, IList collection) 
    at TweetSharp.JsonSerializer.DeserializeCollection(String content, Type type) 
    at TweetSharp.JsonSerializer.DeserializeContent(String content, Type type) 
    at TweetSharp.JsonSerializer.Deserialize[T](RestResponseBase response) 
    at Hammock.RestClient.DeserializeEntityBody[T](RestRequest request, RestResponse`1 response) 
    at Hammock.RestClient.BuildResponseFromResult[T](RestRequest request, WebQuery query) 
    at Hammock.RestClient.Request[T](RestRequest request) 
    at TweetSharp.TwitterService.WithHammockImpl[T](RestRequest request) 
    at TweetSharp.TwitterService.WithHammock[T](String path) 
    at TweetSharp.TwitterService.WithHammock[T](String path, Object[] segments) 
    at TweetSharp.TwitterService.ListTweetsOnUserTimeline(ListTweetsOnUserTimelineOptions options) 

Es ist nicht für alle Twitter-Benutzer passiert. Es passiert nur für wenige Benutzer, die mehr Tweets haben. Bitte schlagen Sie vor, wie man damit umgeht?

Antwort

17

Ich bin mir ziemlich sicher, dass dies mit der neuen Benutzer-ID-Länge zu tun hat, die Twitter für neue Konten verwendet.

Ich hatte den gleichen Fehler bei der Arbeit mit einem neuen Twitter-Konto. Es tritt auch bei älteren Konten auf, wenn sie Tweets oder Erwähnungen von neuen Accounts haben.

Tweetsharp verwendet an einigen Stellen Integer für die user_id, was die Ausnahmen verursacht.

Gehen Sie zu github und laden Sie die neueste Quelle herunter. Es wurde aktualisiert, um die neuen Benutzer-IDs zu verarbeiten. (Sie müssen es selbst kompilieren)

Rob

+11

Klon TweetSharp. Öffne das TweetSharp.Core-Projekt. Install-Paket Hängematte, wenn Sie es nicht haben. Installieren Sie das Paket Newtonsoft.Json, falls Sie es nicht haben. Erstellen Sie nur das TweetSharp-Projekt. Kopieren Sie die bin \ Debug \ TweetSharp.dll in jedes Projekt, das Sie verwenden TweetSharp (entfernen Sie ref, löschen Sie alte, kopieren Sie in neue, fügen Sie Ref, um sicher zu sein). Ich hatte das gleiche Problem mit einem neuen Test-Twitter-Account, dieser hat es behoben, aber nicht mit meinem alten persönlichen Account. Cheers für die Köpfe up @Rob –

+0

Jemand muss update niget –

+0

Wenn Sie irgendein Problem beim Aufbau der neuesten Codebasis, finden Sie die DLLs hier .. https://github.com/mdrahman/TweetSharp.DLL –

12

Twitter hat sich verändert ihre ID von Int32 zu Int64 und TweetSharp aktualisiert hat, dies nicht zu handhaben.

zu beheben:

  1. Im packages.config Datei den Hinweis auf TweetSharp löschen.
  2. öffnen Package Manager Console
  3. PM> Install-Package TweetSharp-Unofficial

Und Boom. Das sollte es tun.

+1

Was ist der Unterschied zwischen beiden? Wie es inoffiziell heißt. Ist es sicher, es zu benutzen? –

+0

@RohitArora Die inoffizielle Version ist eine Gabelung des Originals, die das Feld 'ID' aktualisiert hat. Ich kann nicht garantieren, dass es sicher ist, aber ich benutze es. – Matt

+1

Ich bin froh, dass ich diese Antwort gelesen habe, danke dafür – aw04

3

Ich habe dieses Problem, ich aktualisiere nur JSON.Net-Paket und seine behoben.

Gehen Sie zu Solution Exp -> Referenzen Rechtsklick -> Manage Nuget Pack -> Updates überprüfen und Json.net Pack zu aktualisieren.