Search code examples
azuref#azure-machine-learning-service

C# async/await to F# using Azure ML example


I am working with Azure ML and I have the code sample to invoke my web service (alas it is only in C#). Can someone help me translate this to F#? I have everything but the async and await done.

 static async Task InvokeRequestResponseService()
        {
            using (var client = new HttpClient())
            {
                ScoreData scoreData = new ScoreData()
                {
                    FeatureVector = new Dictionary<string, string>() 
                    {
                        { "Zip Code", "0" },
                        { "Race", "0" },
                        { "Party", "0" },
                        { "Gender", "0" },
                        { "Age", "0" },
                        { "Voted Ind", "0" },
                    },
                    GlobalParameters = new Dictionary<string, string>() 
                    {
                    }
                };

                ScoreRequest scoreRequest = new ScoreRequest()
                {
                    Id = "score00001",
                    Instance = scoreData
                };

                const string apiKey = "abc123"; // Replace this with the API key for the web service
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Bearer", apiKey);

                client.BaseAddress = new Uri("https://ussouthcentral.services.azureml.net/workspaces/19a2e623b6a944a3a7f07c74b31c3b6d/services/f51945a42efa42a49f563a59561f5014/score");
                HttpResponseMessage response = await client.PostAsJsonAsync("", scoreRequest);
                if (response.IsSuccessStatusCode)
                {
                    string result = await response.Content.ReadAsStringAsync();
                    Console.WriteLine("Result: {0}", result);
                }
                else
                {
                    Console.WriteLine("Failed with status code: {0}", response.StatusCode);
                }
            }

Thanks


Solution

  • I was not able to compile and run the code, but you probably need something like this:

    let invokeRequestResponseService() = async {
        use client = new HttpClient()
        let scoreData = (...)
        let apiKey = "abc123"
        client.DefaultRequestHeaders.Authorization <- 
            new AuthenticationHeaderValue("Bearer", apiKey)
        client.BaseAddress <- Uri("https://ussouthcentral..../score");
        let! response = client.PostAsJsonAsync("", scoreRequest) |> Async.AwaitTask
        if response.IsSuccessStatusCode then
            let! result = response.Content.ReadAsStringAsync() |> Async.AwaitTask
            Console.WriteLine("Result: {0}", result);
        else
            Console.WriteLine("Failed with status code: {0}", response.StatusCode) }
    
    • Wrapping the code in the async { .. } block makes it asynchronous and lets you use let! inside the block to perform asynchronous waiting (i.e. in places where you'd use await in C#)

    • F# uses type Async<T> instead of .NET Task, so when you're awaiting a task, you need to insert Async.AwaitTask (or you can write wrappers for the most frequently used operations)

    • The invokeRequestResponseService() function returns F# async, so if you need to pass it to some other library function (or if it needs to return a task), you can use Async.StartAsTask