【问题标题】:Silverlight - Exception when trying to POST to webserviceSilverlight - 尝试 POST 到 Web 服务时出现异常
【发布时间】:2011-09-20 21:18:51
【问题描述】:

我正在使用“发布”方法,因此我可以发送自定义对象。但我在 request.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())
            {
            }
        }
    }

我已经尝试了很多方法来让它发挥作用。希望有人能告诉我哪里出错了。谢谢。

【问题讨论】:

    标签: silverlight wcf rest


    【解决方案1】:

    您需要关闭请求流。您只是关闭 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,这是为您完成的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-12
      • 2012-11-26
      • 2020-10-27
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      相关资源
      最近更新 更多