Задать вопрос
@stuckie

Как отправлять json post-запросы на сервер на .Net Framework Silverlight?

Мне нужно создать приложение для Windows Phone 7. Для этого я использовал Windows Phone 7 SDK с Visual Studio 2010 в нём.
В этом приложении мне нужно отправлять json post-запросы на сервер. Для сего дела я использовал вот этот гайд
https://code.msdn.microsoft.com/windowsapps/Window...
Ибо стандартные методы у меня отсутствовали.

Я решил использовать оба метода с webclient и httpwebrequest. Для начала мне нужно было отправить данные вводимые пользователем для авторизации и получать в виде данных пользователя и его ключ для выполнения других запросов.

Данные сервер требовал в виде : "Метод, ключ пользователя, параметры", а отвечал в виде статуса запроса ("ОК" или "Ошибка") и прочие параметры.

Для работы с Json-ом я использовал стороннюю библиотеку от Newtonsoft

В итоге у меня получилось вот что.

public static class Method
    {
        static object root = null;
        static string Login = null;
        static string Pass = null;
        
        private static void Wbc_UploadCompleted(object sender, UploadStringCompletedEventArgs e)
        {
            if (!string.IsNullOrEmpty(e.Result))
            {
                try
                {
                    root = JsonConvert.DeserializeObject(e.Result);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
        }
        public static AuthorizedAnswer Authorizewbc(string login, string pass)
        {
            Uri URI = new Uri("http://bistrodrive.azurewebsites.net/api`");
            Request req = new Request();
            req.Method = "login";
            req.Parameters = new Dictionary<string, string>();
            req.Parameters.Add("login", login);
            req.Parameters.Add("password", pass);
            string myParameters = JsonConvert.SerializeObject(req);

            WebClient wc = new WebClient();
            //wc.Encoding = Encoding.UTF8;
            wc.Headers["Content-Type"] = "application/json";
            wc.Headers["Accept"] = "application/json";
            wc.Headers["X-Accept"] = "application/json";
            wc.UploadStringCompleted += Wbc_UploadCompleted;
            wc.UploadStringAsync(URI, "POST", myParameters);
            while (root == null) {    }
            return root as AuthorizedAnswer;
            
        }
        public static AuthorizedAnswer Authorizewbr(string login, string pass)
        {
            Login = login;
            Pass = pass;
            string AuthServiceUri = "http://bistrodrive.azurewebsites.net/api";
            HttpWebRequest spAuthReq = HttpWebRequest.Create(AuthServiceUri) as HttpWebRequest;
            spAuthReq.ContentType = "application/json";
            spAuthReq.Method = "POST";
            spAuthReq.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), spAuthReq);
            spAuthReq.Headers["X-Accept"] = "application/json";
            while (root == null) { }
            return root as AuthorizedAnswer;
        }
        static void GetRequestStreamCallback(IAsyncResult callbackResult)
        {
            HttpWebRequest myRequest = (HttpWebRequest)callbackResult.AsyncState;
            Request req = new Request();
            Stream postStream = myRequest.EndGetRequestStream(callbackResult);
            req.Method = "login";
            req.Parameters = new Dictionary<string, string>();
            req.Parameters.Add("login", Login);
            req.Parameters.Add("password", Pass);
            string postData = JsonConvert.SerializeObject(req);
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            postStream.Write(byteArray, 0, byteArray.Length);
            postStream.Close();
            myRequest.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), myRequest);
        }
        static void GetResponsetStreamCallback(IAsyncResult callbackResult)
        {

            try
            {
                HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState;
                HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
                string responseString = "";
                Stream streamResponse = response.GetResponseStream();
                StreamReader reader = new StreamReader(streamResponse);
                responseString = reader.ReadToEnd();
                streamResponse.Close();
                reader.Close();
                response.Close();
                string result = responseString;
                root = JsonConvert.DeserializeObject(result);
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }
        }
    }
public class AuthorizedAnswer
    {
        public String Status { get; set; }
        public List<String> Result { get; set; }
    }
public class Request
    {    
        public string Method { set; get; }
        public Dictionary<string,string> Parameters { set; get; }
        public string Token { set; get; }
    }
}


В результате сервер просто не отправлял ответ. Почему - понятия не имею.
  • Вопрос задан
  • 2822 просмотра
Подписаться 2 Оценить 6 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы