У меня есть веб-сервис 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 );
Чтобы получить поток синхронно (да, плохой стиль, я просто хотел посмотреть, будет ли он работать).Нет успехаЗаранее спасибо.