. NET Core Web API нельзя вызвать из. NET Core Console App - PullRequest
0 голосов
/ 18 апреля 2020

Это очень расстраивает.

У меня есть. NET Базовый Web API, который я могу вызвать из Почтальона и получить ответ (GET / POST / PUT et c.), Но когда я пытаюсь и используйте. NET приложение Core Console для вызова веб-API. Я получаю эту ошибку при использовании метода Post:

Исключение: CLR / System.NullReferenceException Исключение типа 'System.NullReferenceException' произошла в WebServer.dll, но не была обработана в коде пользователя: «Ссылка на объект не установлена ​​для экземпляра объекта».

Теперь я запустил API и клиент в режиме отладки и вижу этот пост-контроллер запускается, но объект («Продукт») пуст. Так что это выглядит как-то. NET Консольное приложение. Тело сообщения не отправляется и не отклоняется, пока с почтальоном все в порядке.

Здесь я должен упомянуть об этом на. NET Консольном клиенте Core, который я использовал получить ошибку сертификата, которая была еще хуже, я использовал, чтобы получить ошибку отклоненного запроса, поэтому я сделал следующее:

Из командной строки выполнено> "do tnet dev-certs https --trust"

, а также добавил код для httpclient:

handler.ServerCertificateCustomValidationCallback=HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;

Может кто-нибудь помочь? Я просто использую простой пример, взятый с веб-сайта Microsoft MSDN.

Просто упомяну, что я использую Windows 10 Pro в качестве ОС, и это машина разработки, на которой работает и веб-API, и клиент, поэтому никакой другой P C участвует.

Спасибо.

Код ниже. Я вставил полный код ниже, так как они являются обобщенным c примером, так что любой может использовать Visual Studio Code / Visual Studio для создания проекта с этим как есть и попытаться отладить, чтобы увидеть, что идет не так.

WebAPI

Контроллер

using Microsoft.AspNetCore.Mvc;
using WebServer.Models;
using System.Collections.Generic;
using System.Linq;
namespace WebServer.Controllers {

    [Route("api/[controller]")]
    public class ProductsController : Controller 
    {
        // Add actions here
        [HttpGet]
        public Product[] Get() 
        {
            return FakeData.Products.Values.ToArray();
        }

        [HttpGet]
        public Product[] GetAllProducts() 
        {
            return FakeData.Products.Values.ToArray();
        }
        [HttpGet("{id}")]
        public Product Get(int id) 
        {
            if (FakeData.Products.ContainsKey(id))
                return FakeData.Products[id];
            else
             return null;
        }

        [HttpPost]
        public Product Post([FromBody]Product product) 
        {
            product.ID = FakeData.Products.Keys.Max() + 1;
            FakeData.Products.Add(product.ID, product);
            return product; // contains the new ID
        }

        [HttpPut("{id}")]
        public void Put(int id, [FromBody]Product product) 
        {
          if (FakeData.Products.ContainsKey(id)) 
          {
            var target = FakeData.Products[id];
            target.ID = product.ID;
            target.Name = product.Name;
            target.Price = product.Price;
          }
        }

        [HttpDelete("{id}")]
        public void Delete(int id) 
        {
           if (FakeData.Products.ContainsKey(id)) 
           {
              FakeData.Products.Remove(id);
           }
        }

    }    
}

Модель

using System.Collections.Generic;
namespace WebServer.Models {
    public class Product {
        public int ID { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
    }

    public class FakeData {
    public static IDictionary<int, Product> Products;
    static FakeData() {
        Products = new Dictionary<int, Product>();
        Products.Add(0, new Product { ID = 0, Name = "Apple", Price = 5.55 });
        Products.Add(1, new Product { ID = 1, Name = "Bike", Price = 6.66 });
        Products.Add(2, new Product { ID = 2, Name = "Coffee", Price = 7.77 });
    }
}
}

. NET Клиент основного консольного приложения (вызывая вышеуказанный Web API)

using System;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

namespace WebClient
{
    public class Product
    {
        public string ID { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }

    class Program
    {
        static HttpClientHandler handler = new HttpClientHandler();
        static HttpClient client = new HttpClient(handler);

        static void ShowProduct(Product product)
        {
            Console.WriteLine($"Name: {product.Name}\tPrice: " +
                $"{product.Price}");
        }

        static async Task<Uri> CreateProductAsync(Product product)
        {
            HttpResponseMessage response = await client.PostAsJsonAsync(
                "api/products", product);
            response.EnsureSuccessStatusCode();

            // return URI of the created resource.
            return response.Headers.Location;
        }

        static async Task<Product> GetProductAsync(string path)
        {
            Product product = null;
            HttpResponseMessage response = await client.GetAsync(path);
            if (response.IsSuccessStatusCode)
            {
                product = await response.Content.ReadAsAsync<Product>();
            }
            return product;
        }

        static async Task<Product> UpdateProductAsync(Product product)
        {
            HttpResponseMessage response = await client.PutAsJsonAsync(
                $"api/products/{product.ID}", product);
            response.EnsureSuccessStatusCode();

            // Deserialize the updated product from the response body.
            product = await response.Content.ReadAsAsync<Product>();
            return product;
        }

        static async Task<HttpStatusCode> DeleteProductAsync(string id)
        {
            HttpResponseMessage response = await client.DeleteAsync(
                $"api/products/{id}");
            return response.StatusCode;
        }

        static void Main()
        {
            RunAsync().GetAwaiter().GetResult();
        }

        static async Task RunAsync()
        {
            // Update port # in the following line.
            handler.ServerCertificateCustomValidationCallback=HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
            client.BaseAddress = new Uri("http://localhost:5000/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

            try
            {
                // Create a new product
                Product product = new Product
                {
                    ID="100",
                    Name = "Orange",
                    Price = 100
                };

                var url = await CreateProductAsync(product);
                Console.WriteLine($"Created at {url}");

                // Get the product
                product = await GetProductAsync(url.PathAndQuery);
                ShowProduct(product);

                // Update the product
                Console.WriteLine("Updating price...");
                product.Price = 80;
                await UpdateProductAsync(product);

                // Get the updated product
                product = await GetProductAsync(url.PathAndQuery);
                ShowProduct(product);

                // Delete the product
                var statusCode = await DeleteProductAsync(product.ID);
                Console.WriteLine($"Deleted (HTTP Status = {(int)statusCode})");

            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                if(e.InnerException!=null)
                {
                    Console.WriteLine(e.InnerException.Message);
                }
            }

            Console.ReadLine();
        }
    }
}
...