2011-09-20 12 views
2

사용자 지정 개체를 보낼 수 있도록 "게시"메서드를 사용하고 있습니다. 하지만 계속 request.BeginGetResponse()에 대한 다음 예외가 발생했습니다 :Silverlight - webservice에 POST 할 때 예외가 발생합니다.

{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()) 
      { 
      } 
     } 
    } 

나는이 작업을 얻을 수있는 많은 방법을 시도했다. 누군가가 바뀌면 어디서 잘못 될지 알 수 있습니다. 감사.

답변

2

요청 스트림을 닫아야합니다. 기본 요청 스트림이 아니라 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을 끄지 않고 ContentLength를 설정할 필요가 없다 (에서만 가능하다 어쨌든 ClientHTTP 구현에), 즉 완료 너를 위해서.

관련 문제