অ্যাসিঙ্ক পোস্ট ডাব্লুপি 7 এবং এফ # এ ব্যর্থ হয়েছে


87

আমি যখন let! read = from.AsyncRead bufএফ # তে করি তখন এটি টিসিপি সকেট মারা না যাওয়া অবরুদ্ধ করে এবং ফিরে আসে না। কেন? এবং আমি কীভাবে এটি ঠিক করব?

এর কোড:

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

এবং এইচটিটিপি-র মাধ্যমে উইন্ডোজ ফোন .1.১ এমুলেটর থেকে এই কোডটি সহ অনুরোধ করেছেন:

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

আমি ফিডলার 2 WP7 এর সাথে কাজ করতে পারিনি।

সম্পাদনা: ইয়াককে স্বাগতম। আমি নিজেই সবুজ চারণভূমিতে চলে এসেছি;)


9
যদি from.AsyncReadব্লকগুলি বোঝায় যে রিমোট সার্ভারটি কোনও বাইট প্রেরণ করে না।
qehgt

স্ট্রিমটি ঠিকমতো বন্ধ হয় না এমন সমস্যা থেকে আমি দূরে সরে এসেছি, তবে আমি এখনও প্রাপ্তির পাশে এবং ডাব্লুপি-তে বেশিরভাগ অপারেশনগুলিতে 40 বাইট আকারের ফাইল পাচ্ছি যা উপলব্ধ না হওয়ার পরিবর্তে নটসপোর্টড এক্সসেপশনকে আটকাচ্ছে files , তাই এটি ডিবাগ করা সত্যিই বেদনাদায়ক। আমি এটি পৌঁছানোর পরে একটি সম্পূর্ণ সমাধান পোস্ট করতে যাচ্ছি।
হেনরিক

আমি এই প্রশ্নটি ভুলিনি; এই মুহুর্তে কেবলমাত্র অনেক কিছু করার জন্য, শীঘ্রই ঠিক করা পোস্ট করবে।
হেনরিক

4
আপনি যদি মোবাইল ডিভাইসগুলির সাথে ফিডলারকে
আলফা

4
আপনি যখন কোনও টিসিপি সকেট থেকে অসীম পরিমাণ বাইটের জন্য অনুরোধ করবেন তখন কি এই প্রত্যাশিত আচরণ নয়?
jyoung

উত্তর:


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.