Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can we use Microsoft.AspNet.WebApi.Client from an ASP.NET Core application?

Tags:

asp.net-core

We want to be able to use the package Microsoft.AspNet.WebApi.Client from our ASP.NET Core MVC web application to make an HTTP call to an outside system. It does work but I couldn't find the corresponding source code in .NET core (github). Is it okay to use this library from the ASP.NET road map point of view? Will it be supported in ASP.NET Core going forward? Most importantly, will this package be supported in non-Windows platforms, as part of ASP.NET Core/.NET Core?

like image 394
Peter Bronc Avatar asked May 15 '16 03:05

Peter Bronc


People also ask

Does ASP.NET Core have Web API?

ASP.NET Core supports creating web APIs using controllers or using minimal APIs. Controllers in a web API are classes that derive from ControllerBase. This article shows how to use controllers for handling web API requests.

What is the difference between ASP.NET Web API and ASP.NET Core Web API?

In ASP.NET Core, there's no longer any distinction between MVC and Web APIs. There's only ASP.NET MVC, which includes support for view-based scenarios, API endpoints, and Razor Pages (and other variations like health checks and SignalR). In addition to being consistent and unified within ASP.NET Core, APIs built in .

Which of the following folders will not be required for a ASP.NET Core Web API project?

The configuration for ASP.NET Core Web API ASP.NET Core doesn't use the App_Start folder or the Global. asax file. The web. config file is added at publish time.


1 Answers

You can try what I did for a REST Client. I found that the assembly you have mentioned in it's latest version does not work in the recently released ASP.Net Core 1.0. Instead of "Microsoft.AspNet.WebApi.Client", use "System.Net.Http".

Then where you would have built an Http POST request like this:

using AvailabilityPricingClient.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AvailabilityPricingClient.Core.Model;
using System.Net.Http;
using System.Net.Http.Headers;

namespace AvailabilityPricingClient.Client
{
    public class ProductAvailabilityPricing : IProductAvailabilityPricing
    {
        private HttpClient _client;
        public ProductAvailabilityPricing(string apiUrl)
        {
            _client = new HttpClient();
            _client.BaseAddress = new Uri(apiUrl);
            _client.DefaultRequestHeaders.Accept.Clear();
            _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        }

        public void Dispose()
        {
            _client.Dispose();
        }


        public async Task<IEnumerable<Availablity>> GetAvailabilityBySkuList(IEnumerable<string> skuList)
        {
            HttpResponseMessage response = _client.PostAsJsonAsync("/api/availabilityBySkuList", skuList).Result;

            if (response.IsSuccessStatusCode)
            {
                var avail = await response.Content.ReadAsAsync<IEnumerable<Availablity>>();
                return avail;
            }

            return null;
        }
    }
}

You will now build like this:

using AvailabilityPricingClient.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AvailabilityPricingClient.Core.Model;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;

namespace AvailabilityPricingClient.Client
{
    public class ProductAvailabilityPricing : IProductAvailabilityPricing
    {
        private HttpClient _client;
        public ProductAvailabilityPricing(string apiUrl)
        {
            _client = new HttpClient();
            _client.BaseAddress = new Uri(apiUrl);
            _client.DefaultRequestHeaders.Accept.Clear();
            _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        }

        public void Dispose()
        {
            _client.Dispose();
        }

        public async Task<IEnumerable<Availablity>> GetAvailabilityBySkuList(IEnumerable<string> skuList)
        {
            var output = JsonConvert.SerializeObject(skuList);
            HttpContent contentPost = new StringContent(output, System.Text.Encoding.UTF8, "application/json");
            HttpResponseMessage response = _client.PostAsync("/api/availabilityBySkuList", contentPost).Result;

            if (response.IsSuccessStatusCode)
            {
                var avail = await response.Content.ReadAsStringAsync()
                    .ContinueWith<IEnumerable<Availablity>>(postTask =>
                    {
                        return JsonConvert.DeserializeObject<IEnumerable<Availablity>>(postTask.Result);
                    });
                return avail;
            }

            return null;
        }
    }
}

This way you interface does not change only the body of your request code changes.

This is working for me....Good luck....

like image 73
Irv Lennert Avatar answered Oct 08 '22 00:10

Irv Lennert