Я использую Javascript API Facebooks для разработки приложения, которое должно иметь возможность публиковать изображение на стене пользователя.Насколько я могу судить, эта часть приложения должна быть серверной, поскольку она должна публиковать данные изображения как «multipart / form-data».
Примечание. Это не простая версия, использующая «отправьте ", но реальный метод" фотографий ".
http://graph.facebook.com/me/photos
Я думаю, что я столкнулся с двумя проблемами, проблемой .NET и Facebook:
Проблема с Facebook: Я не совсем уверен, следует ли отправлять все параметры в виде multipart / form-data (включая access_token и message).Единственный пример кода, который здесь используется, использует утилиту cUrl / application.
.NET проблема: Я никогда не отправлял запросы multipart / form-data из .NET, и я не уверен, что.NET автоматически создает mime-части, или если мне нужно кодировать параметры каким-то особым образом.
Это немного сложно для отладки, поскольку единственное сообщение об ошибке, которое я получаю от Graph API, это "400 -плохой запрос ".Ниже приведен код, который выглядел, когда я решил написать этот вопрос (да, он немного многословен: -)
Окончательным ответом, конечно, будет образец фрагмента, отправляющего изображение из .NET, но я могусоглашайтесь на меньшее.
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();
}
}