2

私は Azure ML を使用しており、Web サービスを呼び出すためのコード サンプルがあります (残念ながら C# のみです)。誰かがこれをF#に翻訳するのを手伝ってくれますか? async と await 以外はすべて完了しました。

 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);
                }
            }

ありがとう

4

1 に答える 1

4

コードをコンパイルして実行することはできませんでしたが、おそらく次のようなものが必要です。

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) }
  • コードをasync { .. }ブロックにラップすると非同期になり、ブロック内で非同期待機を実行できます(つまり、C# でlet!使用する場所で)。await

  • F# はAsync<T>.NET タスクの代わりに型を使用するため、タスクを待機しているときに挿入する必要がありますAsync.AwaitTask(または、最も頻繁に使用される操作のラッパーを作成できます)。

  • このinvokeRequestResponseService()関数は F# 非同期を返すため、他のライブラリ関数に渡す必要がある場合 (またはタスクを返す必要がある場合) は、次を使用できます。Async.StartAsTask

于 2014-09-14T22:22:38.503 に答える