"Метод не найден:" System.Net.Http.HttpRequestMessage System.Web.Http.ApiController.get_Request() ".

короткий вопрос. Вот мой контроллер:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

using Milos_MovieStore.DAL;
using Milos_MovieStore.Models;
using Milos_MovieStore.DTO;
using System.Data.Entity;

namespace Milos_MovieStore.Controllers.Api
{
    public class CustomersController : ApiController
    {

        private DBContext_MovieStore _dbcontext;

        public CustomersController()
        {
            _dbcontext = new DBContext_MovieStore();
        }
        protected override void Dispose(bool disposing)
        {
            _dbcontext.Dispose();
        }



        // GET /api/customers
        [HttpGet]
        public IHttpActionResult GetCustomers()
        {
            List<Customer> customers = _dbcontext.Customers.Include(c => c.MembershipType).ToList();

            return Ok(CustomersToDTOList(customers));
        }

        // GET /api/customers/1
        [HttpGet]
        public IHttpActionResult GetCustomer(int id)
        {
            Customer customer = _dbcontext.Customers.Include(c => c.MembershipType).SingleOrDefault(c => c.Id == id);
            if (customer == null)
                return NotFound();

            return Ok(CustomerToDTO(customer));
        }

        //POST /api/customers
        [HttpPost]
        public IHttpActionResult CreateCustomer(CustomerDTO customerDTO)
        {
            if (!ModelState.IsValid)
                return BadRequest();

            _dbcontext.Customers.Add(DTOToCustomer(customerDTO));
            _dbcontext.SaveChanges();

            return Created(new Uri(Request.RequestUri + "/" + customerDTO.Id), customerDTO);
        }

        // PUT /api/customer/1
        [HttpPut]
        public IHttpActionResult UpdateCustomer(CustomerDTO customerDTO)
        {
            if (!ModelState.IsValid)
                return BadRequest();

            Customer customerInDB = _dbcontext.Customers.SingleOrDefault(c => c.Id == customerDTO.Id);
            if (customerInDB == null)
                return NotFound();

            MapDTOToCustomer(customerDTO, customerInDB);
            _dbcontext.SaveChanges();

            return Ok(customerDTO);
        }

        // DELETE /api/customer/1
        [HttpDelete]
        public IHttpActionResult DeleteCustomer(int id)
        {
            if (!ModelState.IsValid)
                return BadRequest();

            Customer customerInDB = _dbcontext.Customers.SingleOrDefault(c => c.Id == id);
            if (customerInDB == null)
                return NotFound();

            _dbcontext.Customers.Remove(customerInDB);
            _dbcontext.SaveChanges();

            return Ok(id);
        }




        private CustomerDTO CustomerToDTO(Customer customer)
        {
            CustomerDTO customerDTO = new CustomerDTO();

            customerDTO.Id = customer.Id;
            customerDTO.Name = customer.Name;
            customerDTO.DOB = customer.DOB;
            customerDTO.MembershipTypeId = customer.MembershipTypeId;
            customerDTO.IsSubscribedToNewsletter = customer.IsSubscribedToNewsletter;

            return customerDTO;
        }


        private Customer DTOToCustomer(CustomerDTO customerDTO)
        {
            Customer customer = new Customer();

            customer.Id = customerDTO.Id;
            customer.Name = customerDTO.Name;
            customer.DOB = customerDTO.DOB;
            customer.MembershipTypeId = customerDTO.MembershipTypeId;
            customer.IsSubscribedToNewsletter = customerDTO.IsSubscribedToNewsletter;

            return customer;
        }


        private void MapDTOToCustomer(CustomerDTO customerDTO, Customer customer)
        {
            customer.Id = customerDTO.Id;
            customer.Name = customerDTO.Name;
            customer.DOB = customerDTO.DOB;
            customer.MembershipTypeId = customerDTO.MembershipTypeId;
            customer.IsSubscribedToNewsletter = customerDTO.IsSubscribedToNewsletter;
        }

        private IEnumerable<CustomerDTO> CustomersToDTOList(IEnumerable<Customer> customers)
        {
            List<CustomerDTO> customersDTO = new List<CustomerDTO>();

            foreach (Customer c in customers)
            {
                customersDTO.Add(CustomerToDTO(c));
            }

            return customersDTO;
        }


    }
}

... вот мой DTO:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.ComponentModel.DataAnnotations;

namespace Milos_MovieStore.DTO
{
    public class CustomerDTO
    {
        public int Id { get; set; }
        [Required]
        [StringLength(255)]
        public string Name { get; set; }
        public DateTime? DOB { get; set; }
        public byte MembershipTypeId { get; set; }
        public bool IsSubscribedToNewsletter { get; set; }

    }
}

... и вот мой запрос POST:

Postman POST request

... как вы можете видеть на скриншоте, я отправляю DTO в JSON в метод POST в контроллере API. Я просто не могу найти решение. Запросы DELETE и GET работают без проблем. Это учебный проект, поэтому не беспокойтесь о тех странных методах временного сопоставления, которые я поставил в контроллер...

Ответ 1

Я нашел решение для этого.

после того, как я начал сборку, предупреждения о сборке шли в окно вывода, но не отображались в главном окне ошибок/предупреждений.

проверьте окно вывода/ошибки, если есть ошибки или предупреждения, а затем попытайтесь их решить.

Они были связаны с конфликтами сборок и сказали, что рекомендуют поместить перенаправление сборки в web.Config.

Когда-то я прошел через них все это теперь работает.

например:

  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
  </dependentAssembly>

Другая вещь, которую вы можете попробовать: сделать ваш метод как

public IHttpActionResult CreateCustomer([FromBody]CustomerDTO customerDTO){}

посмотрим, поможет ли это..

Ответ 2

У меня та же проблема, но с другой стороны. У меня есть MyProject с System.Net.Http библиотекой и MyUnitTestProject с System.Net.Http тоже. Когда-то давно я запускал модульные тесты, это вылетало со странной проблемой. Неокончательно: тест не запущен: Inconclusive: test not run

И где было какое-то исключение "JetBrains вышел с кодом....", который ничего не говорит мне: Resharper Unit Test exception

Затем я выяснил, в чем проблема в редиректе привязки для System.Net.Http, который был добавлен некоторым пакетом NuGet. Я удаляю перенаправление привязки, но получаю еще одно исключение, близкое к вашему "System.Net.Http.HttpRequestMessage...": enter image description here

Проблема была в версиях библиотек - в MyProject был 4.0.0.0 (из .net Framework), но MyUnitTestProject был 4.2.0.0 (из папки Visual Studio), и был добавлен редирект привязки для 4.2.0.0, который, я думаю, не может быть найденный. Поэтому я изменяю его на 4.0.0.0, и он работает:

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
</dependentAssembly>