Это очень расстраивает.
У меня есть. 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();
}
}
}