Соединение в PasteBin обрывается
Класс который используется для соединения:
using System;
using System.Collections.Specialized;
using System.IO;
using System.Net;
namespace PasteBin
{
class PasteBinClient
{
private const string _apiPostUrl = "http://pastebin.com/api/api_post.php";
private const string _apiLoginUrl = "http://pastebin.com/api/api_login.php";
private readonly string _apiDevKey;
private string _userName;
private string _apiUserKey;
public PasteBinClient(string apiDevKey)
{
if (string.IsNullOrEmpty(apiDevKey))
throw new ArgumentNullException("apiDevKey");
_apiDevKey = apiDevKey;
}
public string UserName
{
get { return _userName; }
}
public void Login(string userName, string password)
{
if (string.IsNullOrEmpty(userName))
throw new ArgumentNullException("userName");
if (string.IsNullOrEmpty(password))
throw new ArgumentNullException("password");
var parameters = GetBaseParameters();
parameters[ApiParameters.UserName] = userName;
parameters[ApiParameters.UserPassword] = password;
WebClient client = new WebClient();
byte[] bytes = client.UploadValues(_apiLoginUrl, parameters);
string resp = GetResponseText(bytes);
if (resp.StartsWith("Bad API request"))
throw new PasteBinApiException(resp);
_userName = userName;
_apiUserKey = resp;
}
public void Logout()
{
_userName = null;
_apiUserKey = null;
}
public string Paste(PasteBinEntry entry)
{
if (entry == null)
throw new ArgumentNullException("entry");
if (string.IsNullOrEmpty(entry.Text))
throw new ArgumentException("The paste text must be set", "entry");
var parameters = GetBaseParameters();
parameters[ApiParameters.Option] = "paste";
parameters[ApiParameters.PasteCode] = entry.Text;
SetIfNotEmpty(parameters, ApiParameters.PasteName, entry.Title);
SetIfNotEmpty(parameters, ApiParameters.PasteFormat, entry.Format);
SetIfNotEmpty(parameters, ApiParameters.PastePrivate, entry.Private ? "1" : "0");
SetIfNotEmpty(parameters, ApiParameters.PasteExpireDate, FormatExpireDate(entry.Expiration));
SetIfNotEmpty(parameters, ApiParameters.UserKey, _apiUserKey);
WebClient client = new WebClient();
byte[] bytes = client.UploadValues(_apiPostUrl, parameters);
string resp = GetResponseText(bytes);
if (resp.StartsWith("Bad API request"))
throw new PasteBinApiException(resp);
return resp;
}
private static string FormatExpireDate(PasteBinExpiration expiration)
{
switch (expiration)
{
case PasteBinExpiration.Never:
return "N";
case PasteBinExpiration.TenMinutes:
return "10M";
case PasteBinExpiration.OneHour:
return "1H";
case PasteBinExpiration.OneDay:
return "1D";
case PasteBinExpiration.OneMonth:
return "1M";
default:
throw new ArgumentException("Invalid expiration date");
}
}
private static void SetIfNotEmpty(NameValueCollection parameters, string name, string value)
{
if (!string.IsNullOrEmpty(value))
parameters[name] = value;
}
private NameValueCollection GetBaseParameters()
{
var parameters = new NameValueCollection();
parameters[ApiParameters.DevKey] = _apiDevKey;
return parameters;
}
private static string GetResponseText(byte[] bytes)
{
using (var ms = new MemoryStream(bytes))
using (var reader = new StreamReader(ms))
{
return reader.ReadToEnd();
}
}
private static class ApiParameters
{
public const string DevKey = "api_dev_key";
public const string UserKey = "api_user_key";
public const string Option = "api_option";
public const string UserName = "api_user_name";
public const string UserPassword = "api_user_password";
public const string PasteCode = "api_paste_code";
public const string PasteName = "api_paste_name";
public const string PastePrivate = "api_paste_private";
public const string PasteFormat = "api_paste_format";
public const string PasteExpireDate = "api_paste_expire_date";
}
}
public class PasteBinApiException : Exception
{
public PasteBinApiException(string message)
: base(message)
{
}
}
public class PasteBinEntry
{
public string Title { get; set; }
public string Text { get; set; }
public string Format { get; set; }
public bool Private { get; set; }
public PasteBinExpiration Expiration { get; set; }
}
public enum PasteBinExpiration
{
Never,
TenMinutes,
OneHour,
OneDay,
OneMonth
}
}
Если использовать напрямую соединение и отправку то всё работает:
string apiKey = "<your api key>";
var client = new PasteBinClient(apiKey);
// Опционально, без авторизации отправится анонимно
client.Login(userName, password);
var entry = new PasteBinEntry
{
Title = "PasteBin client test",
Text = "Console.WriteLine(\"Hello PasteBin\");",
Expiration = PasteBinExpiration.OneDay,
Private = true,
Format = "csharp"
};
string pasteUrl = client.Paste(entry);
Но как мне сделать чтобы авторизация держалась? К примеру на одну кнопку я хочу авторизоваться, а дальше отправить данные по другой кнопке:
// Кнопка подключения к серверу
private void Connect_Click(object sender, System.EventArgs e)
{
client = new PasteBinClient(this.TextBox1.Text);
MessageBox.Show("Подключены");
}
// Кнопка отправки данных на сервер
private void Send_Click(object sender, System.EventArgs e)
{
// client = new PasteBinClient(this.TextBox1.Text);
var entry = new PasteBinEntry
{
Title = "PasteBin client test",
Text = "Console.WriteLine(\"Hello PasteBin\");",
Expiration = PasteBinExpiration.OneDay,
Private = true,
Format = "csharp"
};
string result = client.Paste(entry); // Тут ошибка подключения ( если не напрямую делать подключение )
MessageBox.Show(result);
}