L'affichage de l'image .NET pour Facebook mur à l'aide de l'API Graphique

Je suis en utilisant le Facebook de l'API Javascript pour développer une application qui devra être en mesure de poster une image d'un des utilisateurs de la paroi.
La partie de l'application doit être de serveur-côté aussi loin que je peux dire, depuis qu'il a besoin de publier les données de l'image comme "multipart/form-data".

Remarque: Ce n'est pas la version simple, à l'aide de "post", mais les vraies "photos" de la méthode.

http://graph.facebook.com/me/photos

Je pense que je suis confronté à deux problèmes, une .NET et Facebook problème:

Facebook problème: je ne suis pas tout à fait sûr si tous les paramètres doivent être envoyer en tant que " multipart/form-data (y compris l'access_token et message). Le seul exemple de code n'utilise la boucle util/de l'application.

.NET problème: je n'ai jamais émis multipart/form-data demandes de .NET , et je ne suis pas sûr que si .NET crée automatiquement le mime-pièces, ou si je dois encoder les paramètres d'une certaine manière.

C'est un peu difficile à déboguer, puisque la seule réponse d'erreur que je reçois de l'API Graphique est "de 400 bad request".
Ci-dessous est le code tel qu'il regardait quand j'ai décidé d'écrire cette question (oui, c'est un peu verbeux 🙂

La réponse ultime serait, bien entendu, un échantillon extrait de l'affichage d'une image à partir .NET, mais je peux me contenter de moins.

string username = null;
string password = null;
int timeout = 5000;
string requestCharset = "UTF-8";
string responseCharset = "UTF-8";
string parameters = "";
string responseContent = "";
string finishedUrl = "https://graph.facebook.com/me/photos";
parameters = "access_token=" + facebookAccessToken + "&message=This+is+an+image";
HttpWebRequest request = null;
request = (HttpWebRequest)WebRequest.Create(finishedUrl);
request.Method = "POST";
request.KeepAlive = false;
//application/x-www-form-urlencoded | multipart/form-data
request.ContentType = "multipart/form-data";
request.Timeout = timeout;
request.AllowAutoRedirect = false;
if (username != null && username != "" && password != null && password != "")
{
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential(username, password).GetCredential(new Uri(finishedUrl), "Basic");
}
//write parameters to request body
Stream requestBodyStream = request.GetRequestStream();
Encoding requestParameterEncoding = Encoding.GetEncoding(requestCharset);
byte[] parametersForBody = requestParameterEncoding.GetBytes(parameters);
requestBodyStream.Write(parametersForBody, 0, parametersForBody.Length);
/*
This wont work
byte[] startParm = requestParameterEncoding.GetBytes("&source=");
requestBodyStream.Write(startParm, 0, startParm.Length);
byte[] fileBytes = File.ReadAllBytes(Server.MapPath("images/sample.jpg"));
requestBodyStream.Write( fileBytes, 0, fileBytes.Length );
*/
requestBodyStream.Close();
HttpWebResponse response = null;
Stream receiveStream = null;
StreamReader readStream = null;
Encoding responseEncoding = System.Text.Encoding.GetEncoding(responseCharset);
try 
{
response = (HttpWebResponse) request.GetResponse();
receiveStream = response.GetResponseStream();
readStream = new StreamReader( receiveStream, responseEncoding );
responseContent = readStream.ReadToEnd();
}
finally 
{
if (receiveStream != null)
{
receiveStream.Close();
}
if (readStream != null)
{
readStream.Close();
}
if (response != null)
{
response.Close();
}
}

OriginalL'auteur Torben Warberg Rohde | 2011-02-04