WebRequest BeginGetRequestStream и BeginGetResponse не запускают свои обратные вызовы - PullRequest
0 голосов
/ 04 июля 2011

У меня есть веб-сервис PHP, использующий JSON, для которого мне нужно отправлять запросы из приложения Silverlight.Я использовал класс HttpWebRequest раньше, в обычном приложении C #, и он работал безупречно.Однако в моем приложении Silverlight обратные вызовы для методов BeginGetRequestStream и BeginGetResponse не вызываются.

Я пытался протестировать его практически во всех отношениях, но безуспешно.Обратите внимание, что данные, которые я отправляю, не длинные - в большинстве случаев это просто строка из 32 символов.Я проверил, вызывались ли обратные вызовы вообще, и не вызывались ли они.Вот мой код:

    public void Request(Command cmd, Dictionary<string, string> data)
            {
                Dictionary<string, object> fullRequest = new Dictionary<string,object>();
                HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest;
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";                 

                StringWriter writer = new StringWriter(new StringBuilder());
                JsonSerializer serializer = new JsonSerializer();
                serializer.Serialize(writer, fullRequest);
                string query = "query=" + writer.ToString();

                request.ContentLength = query.Length;
                request.ContentType = "text/json";
                _queue.Enqueue(new KeyValuePair<Command, string>(cmd, query));
                request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

public void GetRequestStreamCallback(IAsyncResult target)
        {

            HttpWebRequest request = (HttpWebRequest)target.AsyncState;

            Stream postStream = request.EndGetRequestStream(target);
            string postData = "";
            //not sure why I have to do this. in the Silverlight documentation
            //Queue<> is supposed to have the SyncRoot property
            //but  I get an error if I just try _queue.SyncRoot
            lock ((_queue as ICollection).SyncRoot)
            {
                postData = _queue.Dequeue().Value;

            }
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            postStream.Write(byteArray, 0, postData.Length);
            postStream.Close();
            request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
        }


 public void GetResponseCallback(IAsyncResult result)
        {

            HttpWebRequest request = (HttpWebRequest)result.AsyncState;            
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
            Stream streamResponse = response.GetResponseStream();
            StreamReader streamRead = new StreamReader(streamResponse);
            string responseString = streamRead.ReadToEnd();            
            streamResponse.Close();
            streamRead.Close();            
            response.Close();           
            JsonSerializer serializer = new JsonSerializer();
            Dictionary<string, object> responseData = new Dictionary<string, object>();
            responseData = (Dictionary<string, object>)serializer.Deserialize(new StringReader(responseString), typeof(Dictionary<string, object>));
            if (_data.ContainsKey(responseData["key"] as string))
            {
                _data[responseData["key"] as string] = responseData;
            }
            else
            {
                _data.Add(responseData["key"] as string, responseData);
            }

Я также попробовал это:

IAsyncResult resultRequest = request.BeginGetRequestStream(null, null) as IAsyncResult;
Stream postStream = request.EndGetRequestStream(resultRequest );

Чтобы получить поток синхронно (да, плохой стиль, я просто хотел посмотреть, будет ли он работать).Нет успехаЗаранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...