অ্যাসিঙ্ক পোস্ট ডাব্লুপি 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.