반응형
WP7 및 F #에서 비동기 POST가 실패 함
let! read = from.AsyncRead buf
F #에서 수행 하면 TCP 소켓이 죽을 때까지 차단되고 반환되지 않습니다. 왜? 그리고 어떻게 고치나요?
코드 :
module StreamUtil
open System.IO
/// copy from 'from' stream to 'toStream'
let (|>>) (from : Stream) (toStream : Stream) =
let buf = Array.zeroCreate<byte> 1024
let rec doBlock () =
async {
let! read = from.AsyncRead buf
if read <= 0 then
toStream.Flush()
return ()
else
do! toStream.AsyncWrite(buf, 0, read)
return! doBlock () }
doBlock ()
이 코드에서 호출됩니다.
use fs = new FileStream(targPath, FileMode.CreateNew, FileAccess.ReadWrite)
do! req.InputStream |>> fs
Windows Phone 7.1 에뮬레이터에서 다음 코드를 사용하여 HTTP를 통해 요청했습니다.
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());
}
}
실패했습니다. ResponseReady
콜백에 도달되지 않습니다.
한편이 코드는 훌륭하게 작동합니다.
open System
open System.Net.Http // WebAPI nuget
let sync aw = Async.RunSynchronously aw
let postC<'a> (c : HttpClient) (r : Uri) (cont : HttpContent) =
let response = sync <| Async.AwaitTask( c.PostAsync(r, cont) )
let struc:'a = sync <| deserialize<'a> response
response, struc
let withContent<'a> (fVerb : (HttpClient -> Uri -> HttpContent -> _ * 'a))=
let c = new HttpClient()
fVerb c
[<Test>]
let ``POST /images 201 + Location header`` () =
let post = withContent<MyImage> postC
let bytes = IO.File.ReadAllBytes("sample.jpg")
let hash = SHA1.Create().ComputeHash(bytes) |> 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) ||> post
resp.StatusCode =? Code.Created
ri.sha1 =? hash
mustHaveHeaders resp
Fiddler2가 WP7과 함께 작동하도록 할 수 없습니다.
편집 : 야크에 오신 것을 환영합니다. 나는 녹색 목초지로 직접 이사했습니다.)
BufferStream INput 출력을 보내고 사용하기 전에 바이트를 넣어야합니다.
참고 URL : https://stackoverflow.com/questions/10615461/async-post-fails-on-wp7-and-f
반응형
'programing' 카테고리의 다른 글
Xcode 프로젝트에 시뮬레이터 목록이 표시되지 않음 (0) | 2020.09.17 |
---|---|
AngularJs에서 X 번만 반복 ng-repeat (0) | 2020.09.17 |
WebWorker는 느린 regexp 일치를 상당히 느리게 (3x) 계산합니다. (0) | 2020.09.17 |
모듈에 모의 인스턴스가있는 경우 RoboGuice 인젝터를 만드는 동안 프로세스가 충돌합니다. (0) | 2020.09.17 |
값이 함수인지 테스트 (0) | 2020.09.16 |