web-dev-qa-db-ja.com

C#UWPアプリケーションでASP.NET Core Web APIを使用する方法

UWP/UAPアプリケーション内でASP.NET Core WebAPIを使用する方法を理解しようとしています。 WCFサービスを利用するのと同じようにWebAPIを利用することは可能だと思っていましたが、まだ何も見つかりません。

さらに、Microsoft.AspNet.WebApi.Coreをインストールしようとしましたが、UAP(バージョン= V10.0)と互換性がないため、成功しませんでした。

少し迷ってしまいました。たぶん、誰かが私にUWPアプリケーション内でWebApiを使用する方法のヒントを教えてくれるでしょう。

7
Chris

これは、API呼び出しを使用するのと同じです。 HttpClientクラスを使用してエンドポイントを呼び出し、応答を処理するだけです。予想される動作に違いはありません。

次のように定義されたASP.NET Core Web APIエンドポイントがあるとします。

public class StackoverflowController : Controller
{    
    // I wanted to exemplify async capabilities.
    // You'd use async/await for getting database values, etc.
    [
        HttpGet,
        AllowAnonymous,
        Route("api/greeting")
    ]
    public Task<GreetingResult> Greeting() =>
        Task.FromResult(new GreetingResult { Message = "Hello world!" });
}

public class GreetingResult
{
    public string Message { get; set; }
}

これが「localhost:5000」でホストされていると仮定すると、次のことができます。

public class Consumer
{
    public async Task<string> GetGreetingAsync()
    {
        using (var client = new HttpClient())
        {
            var response = 
                await client.GetStringAsync("http://localhost:5000/api/greeting");
            // The response object is a string that looks like this:
            // "{ message: 'Hello world!' }"
        }
    }
}

さらに、厳密に型指定されたオブジェクトがNewtonsoft.Jsonを使用するため、これを逆シリアル化できます。私のUWPアプリがまさにこれを行う例があります ここ

7
David Pine

さらに情報を追加します。

UWPでWeb APIを使用する最良の方法は、前述のようにHttpClientを使用することです。

ここに私が役立つと思ういくつかの例があります。

Web APIレベルで実行できるすべての操作を収集できるMobileServiceClientクラスを作成することをお勧めします。

public class MobileServiceClient
{
    //access token if you use authentication:
    private string _accessToken;
    //address of your Web Api:
    private string _serviceAddress;

    //Constructor:
    public MobileServiceClient(string accessToken, string serviceAddress)
    {
        _accessToken = accessToken;
        _serviceAddress = serviceAddress;
    }

//Now you can implement methods that you will invoke to perform selected operation related with Web Api:

#region Methods

//You can perform "Get" to retrieve object from the Web Api and then deserialize it (using Json .NET):

public async Task<SampleClass> GetSampleClass()
    {
        SampleClass sampleClass= null;
        try
        {
            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _accessToken);
                var data = await client.GetAsync(string.Concat(_serviceAddress, "routeName"));
                var jsonResponse = await data.Content.ReadAsStringAsync();
                if (jsonResponse != null)
                    sampleClass= JsonConvert.DeserializeObject<SampleClass>(jsonResponse);
                return sampleClass;
            }
        }

        catch (WebException exception)
        {
            throw new WebException("An error has occurred while calling GetSampleClass method: " + exception.Message);
        }
    }

//You can perform "Get" to retrieve list of objects and then deserialize it:

public async Task<List<SampleClass>> GetSampleClassObjects()
    {
        List<SampleClass> SampleClassObjectsList = null;
        try
        {
            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _accessToken);
                var data = await client.GetAsync(string.Concat(_serviceAddress, "routeName"));
                var jsonResponse = await data.Content.ReadAsStringAsync();
                if (jsonResponse != null)
                    SampleClassObjectsList = JsonConvert.DeserializeObject<List<SampleClass>>(jsonResponse);
                return SampleClassObjectsList;
            }
        }

        catch (WebException exception)
        {
            throw new WebException("An error has occurred while calling GetSampleClassObjects method: " + exception.Message);
        }
    }

//You can also "Post" some object:

public async Task<bool> PostSomeObject(SampleClass sampleClassObject)
    {
        try
        {
            using (HttpClient client = new HttpClient())
            {
                var sampleClassObjectJson = JsonConvert.SerializeObject(sampleClassObject);
                client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _accessToken);
                var content = new StringContent(sampleClassObjectJson, Encoding.UTF8, "application/json");
                HttpResponseMessage response = await client.PostAsync(string.Concat(_serviceAddress + "routeName"), content);
                if (response.StatusCode == HttpStatusCode.OK)
                    return true;
                else
                    throw new WebException("An error has occurred while calling PostSomeObject method: " + response.Content);
            }
        }

        catch (WebException exception)
        {
            throw new WebException("An error has occurred while calling PostFeedback method: " + exception.Message);
        }
    }
#endregion
}

このような実装では、たとえば他のプラットフォーム(Xamarin AndroidまたはiOSなど)をサポートすることを決定した場合、将来コードを共有できることに注意してください。これがあなたの助けになることを願っています。

5

David Pinesの回答は、すべてを手動で実行したい場合、またはSwaggerを使用しない場合に十分です。

Swagger(つまり Swashbuckle Swagger 6. for ASP.NET Core)を使用してRESTful APIを記述し、そのドキュメントを生成する場合、swagger定義ファイル(swagger.json)を使用してRestクライアントを生成できます。 。そのようなツールの1つは、Azureチームによって作成された AutoRest です。また、DotNetを既にサポートしている Microsoft.Rest.ClientRuntime も必要です。

ASP.NET Core RTM=で動作するかどうかはまだわかりませんが、以前のバージョンのサポートとそれに統合されたベータ版を示す問題が解決またはクローズされました。

NuGetパッケージリンク

3
Tseng