Silverlight - исключение при попытке POST к веб-сервису - PullRequest
2 голосов
/ 20 сентября 2011

Я использую метод "Post", чтобы я мог отправить пользовательский объект.Но я продолжаю получать следующее исключение по запросу. BeginGetResponse ():

{System.Net.ProtocolViolationException: операция недопустима из-за текущего состояния объекта.в System.Net.Browser.BrowserHttpWebRequest.BeginGetResponseImplementation ()}

public void Send()
    {
        HttpWebRequest client = WebRequest.Create(new Uri(BaseUrl)) as HttpWebRequest;
        client.Method = "POST";
        client.ContentLength = MaxSerializationSize;
        client.BeginGetRequestStream(new AsyncCallback(RequestProceed), client);
    }

    private void RequestProceed(IAsyncResult asuncResult)
    {
        HttpWebRequest request = (HttpWebRequest) asuncResult.AsyncState;

        StreamWriter postDataWriter = new StreamWriter(request.EndGetRequestStream(asuncResult));
        MemoryStream ms = new MemoryStream();
        DataContractJsonSerializer ser = new     DataContractJsonSerializer(typeof(MyCustomClass));
        ser.WriteObject(ms, MyCustomClassObject);
        postDataWriter.Write(ms);
        postDataWriter.Close();

        request.BeginGetResponse(new AsyncCallback(ResponceProceed), request);

    }

    private void ResponceProceed(IAsyncResult asuncResult)
    {
        var request = (HttpWebRequest) asuncResult.AsyncState;

        using (var resp = (HttpWebResponse) request.EndGetResponse(asuncResult))
        {
            using (var stream = resp.GetResponseStream())
            {
            }
        }
    }

Я пробовал так много способов, чтобы заставить это работать.Надеюсь, кто-то может сказать мне, где я иду не так.Благодарю.

1 Ответ

2 голосов
/ 20 сентября 2011

Вам необходимо закрыть поток запросов.Вы просто закрываете StreamWriter, а не основной поток запросов.Пока вы в нем, удалите лишние MemoryStream и сделайте запись DataContractJsonSerializer непосредственно в поток запросов.

 HttpWebRequest request = (HttpWebRequest) asuncResult.AsyncState;

 using (Stream outStream = request.EndGetRequestStream(asyncResult));
 {
      DataContractJsonSerializer ser = new     DataContractJsonSerializer(typeof(MyCustomClass));           
      ser.WriteObject(outStream, MyCustomClassObject);
      outStream.Flush();
      outStream.Close();
 }

 request.BeginGetResponse(new AsyncCallback(ResponceProceed), request); 

Также избавьтесь от этой строки: -

 client.ContentLength = MaxSerializationSize; 

Не отключая также AllowWriteStreamBuffering (что в любом случае возможно только в реализации ClientHTTP), нет необходимости устанавливать ContentLength, что сделано для вас.

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