Rest WP7和WPF上的异步POST失败#

Rest WP7和WPF上的异步POST失败#,rest,asynchronous,f#,windows-phone,Rest,Asynchronous,F#,Windows Phone,当我做的时候,让我来!read=from.AsyncRead buf在F#中,它会阻塞,直到TCP套接字死机后才会返回。为什么?我该如何修复它 其代码: 模块StreamUtil 开放系统 ///从“from”流复制到“toStream” let(|>>)(from:Stream)(toStream:Stream)= 让buf=Array.zeroCreate 1024 让rec doBlock()= 异步的{ let!read=from.AsyncRead buf 如果读取(c:HttpCli

当我做
的时候,让我来!read=from.AsyncRead buf
在F#中,它会阻塞,直到TCP套接字死机后才会返回。为什么?我该如何修复它

其代码:

模块StreamUtil
开放系统
///从“from”流复制到“toStream”
let(|>>)(from:Stream)(toStream:Stream)=
让buf=Array.zeroCreate 1024
让rec doBlock()=
异步的{
let!read=from.AsyncRead buf
如果读取(c:HttpClient)(r:Uri)(cont:HttpContent)=
让响应=同步响应
结构反应
let with content Convert.tobase64字符串
设pic=新的ByteArrayContent(字节)
pic.Headers.Add(“内容类型”、“图像/jpeg”)
图片标题添加(“X-SHA1-Hash”,散列)
让resp,ri=(资源“/图像”,pic)| |>post
resp.StatusCode=?代码已创建
ri.sha1=?散列
必须有标题和标题
我无法让小提琴手2与WP7一起工作


编辑:欢迎来到牦牛。我自己也搬到了更绿的牧场上;)

在发送和使用BufferStream输入输出之前,如果.AsyncRead中的
块表示远程服务器不发送任何字节,则应该将字节放入缓冲流中。我已经摆脱了流无法正常关闭的问题,但是在接收端和WP上,我仍然只得到大小为40字节的文件,很多操作正在阻止throw NotSupportedException,而不是不可用,因此调试非常痛苦。当我找到完整的解决方案时,我将发布一个完整的解决方案。我没有忘记这个问题;现在有很多事情要做,将发布修复简而言之。如果你想让fiddler在移动设备上工作,这可能会对你有用:当你从TCP套接字请求无限量的字节时,这不是预期的行为吗?
public void Send()
{
    var b = new UriBuilder(_imageService.BaseUrl) {Path = "/images"};

    var req = WebRequest.CreateHttp(b.Uri);
    req.ContentType = "image/jpeg";
    req.Method = "POST";
    var imgLen = SelectedImage.ImageStream.Length;
    req.Headers[HttpRequestHeader.ContentLength] = imgLen.ToString(CultureInfo.InvariantCulture);
    req.Accept = "application/json";
    req.BeginGetRequestStream(RequestReady, new ReqState(req, imgLen));
}

void RequestReady(IAsyncResult ar)
{
    var state = (ReqState)ar.AsyncState;
    var req = state.Request;

    var reqStream = req.EndGetRequestStream(ar);

    SmartDispatcher.BeginInvoke(() =>
        {
            using (var sw = new StreamWriter(reqStream))
            using (var br = new BinaryReader(SelectedVoucher.ImageStream))
            {
                var readBytes = br.ReadBytes(state.ImgLen);

                // tried both 2
                sw.Write(readBytes);
                //sw.Write(Convert.ToBase64String(readBytes));
                sw.Flush();
                sw.Close();
            }
            req.BeginGetResponse(ResponseReady, req);
        });
}

// WHY IS IT YOU ARE NOT CALLED???
void ResponseReady(IAsyncResult ar)
{
    try
    {
        var request = (HttpWebRequest)ar.AsyncState;
        var response = request.EndGetResponse(ar);

        SmartDispatcher.BeginInvoke(() =>
            {
                var rdr = new StreamReader(response.GetResponseStream());
                var msg = rdr.ReadToEnd();

                var imageLocation = response.Headers["Location"];

                Debug.WriteLine(msg);
                Debug.WriteLine(imageLocation);
            });
    }
    catch (WebException ex)
    {
        Debug.WriteLine(ex.ToString());
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.ToString());
    }
}