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