2012-02-22 60 views
2

我正在努力与facebook图片上传。 我使用Facebook C#SDK 5.4.1从我的Silverligth 5应用程序(在浏览器中)上传图片。Facebook C#SDK抛出ArgumentNullException

身份验证正在工作,我得到我的访问令牌具有所需的权限。 (我存储我的访问令牌在cookie中,因为我不希望我的Silverlight应用程序重新加载。)

这是我的代码:

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); 
      })); 
     } 
    } 

唯一的例外是的PostCompleted事件抛出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)} 

感谢您的帮助。

回答

2

我自己想出了这个问题。

如果图片的编码错误,您会得到ArgumentNullException,因为Facebook根本没有回应。 我也试过solution(稍微调整了一下代码,因为Silverlight 5不支持WriteableBitmap.SaveJpeg()),HTTP错误404是我得到的响应。

如果别人encouters类似的问题(和我:-)是混淆)也许我可以用下面的解决方案(使用Facebook的C#SDK 5.4.1和Silverlight 5在浏览器中)帮助:

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); 

其中变量Img是一个WriteableBitmap。 对于正确的编码,我使用的是Imagetools from Codeplex

注意:您需要有效的access_token才能使其正常工作!

+0

考虑将此标记为答案!感谢您的跟踪。 – 2012-02-24 03:51:03