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
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