Note that there are some explanatory texts on larger screens.

plurals
  1. POAsync POST fails on WP7 and F#
    primarykey
    data
    text
    <p>When I do <code>let! read = from.AsyncRead buf</code> in F#, it blocks and doesn't return until the TCP socket is dead. Why? And how do I fix it?</p> <p>Its code:</p> <pre class="lang-ml prettyprint-override"><code>module StreamUtil open System.IO /// copy from 'from' stream to 'toStream' let (|&gt;&gt;) (from : Stream) (toStream : Stream) = let buf = Array.zeroCreate&lt;byte&gt; 1024 let rec doBlock () = async { let! read = from.AsyncRead buf if read &lt;= 0 then toStream.Flush() return () else do! toStream.AsyncWrite(buf, 0, read) return! doBlock () } doBlock () </code></pre> <p>It's being called from this code:</p> <pre class="lang-ml prettyprint-override"><code>use fs = new FileStream(targPath, FileMode.CreateNew, FileAccess.ReadWrite) do! req.InputStream |&gt;&gt; fs </code></pre> <p>and requested over HTTP with this code from Windows Phone 7.1 emulator:</p> <pre><code>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(() =&gt; { 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(() =&gt; { 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()); } } </code></pre> <p>Unsuccessfully. The <code>ResponseReady</code> callback is never reached.</p> <p>Meanwhile, this code works excellent:</p> <pre class="lang-ml prettyprint-override"><code>open System open System.Net.Http // WebAPI nuget let sync aw = Async.RunSynchronously aw let postC&lt;'a&gt; (c : HttpClient) (r : Uri) (cont : HttpContent) = let response = sync &lt;| Async.AwaitTask( c.PostAsync(r, cont) ) let struc:'a = sync &lt;| deserialize&lt;'a&gt; response response, struc let withContent&lt;'a&gt; (fVerb : (HttpClient -&gt; Uri -&gt; HttpContent -&gt; _ * 'a))= let c = new HttpClient() fVerb c [&lt;Test&gt;] let ``POST /images 201 + Location header`` () = let post = withContent&lt;MyImage&gt; postC let bytes = IO.File.ReadAllBytes("sample.jpg") let hash = SHA1.Create().ComputeHash(bytes) |&gt; Convert.ToBase64String let pic = new ByteArrayContent(bytes) pic.Headers.Add("Content-Type", "image/jpeg") pic.Headers.Add("X-SHA1-Hash", hash) let resp, ri = (resource "/images", pic) ||&gt; post resp.StatusCode =? Code.Created ri.sha1 =? hash mustHaveHeaders resp </code></pre> <p>I couldn't get Fiddler2 working with WP7.</p> <p><strong>EDIT: Welcome to a yak. I've moved onto greener pastures myself ;)</strong></p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload