2 votes

Facebook C# SDK jette ArgumentNullException

J'ai des difficultés avec le téléchargement d'images sur Facebook. J'utilise le Facebook C# SDK 5.4.1 pour télécharger une image à partir de mon application Silverligth 5 (dans le navigateur).

L'authentification fonctionne et j'obtiens mon jeton d'accès avec les autorisations nécessaires. (Je stocke mon jeton d'accès dans un cookie car je ne veux pas que mon application Silverlight soit rechargée).

Voici mon code :

void img_LoadingCompleted(object sender, EventArgs e)
    {

        Dispatcher.BeginInvoke(new Action(() => { string fbcode = ReadCookie("FBCode");

        ExtendedImage img = sender as ExtendedImage;
        string myAppId = "MY_APPID";
        string myAppSecret = "MY_SECRET";

        FacebookClient fbclient = new FacebookClient(fbcode);
        fbclient.PostCompleted += new EventHandler<FacebookApiEventArgs>(fbclient_PostCompleted);

        FacebookMediaObject image = new FacebookMediaObject
        {
            ContentType = "image/jpg",
            FileName = "Testpic"
        };
        image.SetValue(img.Pixels);

        IDictionary<string, object> photoDetails = new Dictionary<string, object>
            {
                {"message", "Test"},
                {"source", image}
            };

        fbclient.PostAsync("/me/photos", photoDetails);
        }));
    }

    void fbclient_PostCompleted(object sender, FacebookApiEventArgs e)
    {
        if (e.Cancelled)
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                MessageBox.Show("Cancelled: "+e.Error);
            }));
        }
    }

L'exception est levée dans l'événement PostCompleted du FacebookClient.

{System.ArgumentNullException: Der Wert darf nicht NULL sein.
Parametername: stream
   bei System.IO.StreamReader..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean leaveOpen)
   bei System.IO.StreamReader..ctor(Stream stream)
   bei Facebook.FacebookClient.ProcessResponse(HttpHelper httpHelper, Stream responseStream, Type resultType, String& responseStr, Exception& exception, Boolean& cancelled)}

Merci pour votre aide.

2voto

Danscho Points 393

J'ai trouvé le problème moi-même.

Si l'encodage de l'image est incorrect, vous obtiendrez une exception ArgumentNullException car Facebook ne répond tout simplement pas. J'ai également essayé ceci solution (j'ai un peu modifié le code car Silverlight 5 ne supporte pas WriteableBitmap.SaveJpeg()) et la réponse que j'ai obtenue est une erreur HTTP 404.

Si quelqu'un d'autre rencontre un problème similaire (et est aussi confus que moi :-)), je peux peut-être l'aider avec la solution suivante (en utilisant Facebook C# SDK 5.4.1 et Silverlight 5 In-Browser) :

JpegEncoder JE = new JpegEncoder();
MemoryStream M = new MemoryStream();
JE.Encode(Img.ToImage(), M);

Byte[] ImgData = new Byte[M.Length];
M.Seek(0, SeekOrigin.Begin);
M.Read(ImgData, 0, (int)M.Length);

FacebookClient fbclient = new FacebookClient(fbcode);
fbclient.UploadProgressChanged += new EventHandler<FacebookUploadProgressChangedEventArgs>(fbclient_UploadProgressChanged);
fbclient.PostCompleted += new EventHandler<FacebookApiEventArgs>(fbclient_PostCompleted);

FacebookMediaObject image = new FacebookMediaObject
{
    ContentType = "image/jpg",
    FileName = "Testpic"
};
image.SetValue(ImgData);

IDictionary<string, object> photoDetails = new Dictionary<string, object>
{
     {"message", "Test"},
     {"source", image}
};

new Thread(new ParameterizedThreadStart((fbc) => { StartWait(); ((FacebookClient)fbc).PostAsync("me/photos", photoDetails); })).Start(fbclient);

Où la variable Img est un WriteableBitmap. Pour le bon encodage, j'utilise la variable Imagetools de Codeplex

AVIS : Vous avez besoin d'un code d'accès valide pour que cela fonctionne !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X