Отправка объекта С# на контроллер webapi

Я пытаюсь передать объект С# контроллеру веб-API. API настроен для хранения отправленных в него объектов типа Product. Я успешно добавил объекты с помощью метода Jquery Ajax, и теперь я пытаюсь получить тот же результат на С#.

Я создал простое консольное приложение для отправки запроса Post в API:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public decimal Price { get; set; }
}

         static void Main(string[] args)
    {
        string apiUrl = @"http://localhost:3393/api/products";
        var client = new HttpClient();
        client.PostAsJsonAsync<Product>(apiUrl, new Product() { Id = 2, Name = "Jeans", Price = 200, Category =  "Clothing" });

    }

Метод postproduct никогда не вызывается, как отправить этот объект контроллеру?

Метод, используемый для добавления элементов:

    public HttpResponseMessage PostProduct([FromBody]Product item)
    {
        item = repository.Add(item);
        var response = Request.CreateResponse<Product>(HttpStatusCode.Created, item);

        string uri = Url.Link("DefaultApi", new { id = item.Id });
        response.Headers.Location = new Uri(uri);
        return response;
    }

person neo112    schedule 26.10.2013    source источник
comment
Ваш код выглядит нормально, что вы видите в скрипаче? Вы включили трассировку webapi на сервере?   -  person Darrel Miller    schedule 26.10.2013
comment
Я вижу запросы, исходящие из формы, которую я использую, никакие запросы, отправленные HttpClient, не видны в Fiddler. Я также загрузил API на: producttestapi.azurewebsites.net/api/products, но не запросов от HttpClient также достигают этого API.   -  person neo112    schedule 27.10.2013
comment
также проверьте index.html этого URL-адреса, это форма, которую я использую для отправки объектов через ajax, она работает, поэтому с API все в порядке.   -  person neo112    schedule 27.10.2013


Ответы (1)


Похоже, вы каким-то образом отключили прием JSON в качестве формата для публикации. Мне удалось отправить данные на вашу конечную точку и создать новый продукт с помощью application/x-www-form-urlencoded. Вероятно, именно так ваш запрос jQuery делает это.

Можете ли вы показать код конфигурации вашего веб-API? Вы меняете форматтеры по умолчанию?

Или вы можете отправить форму из HttpClient. например

    string apiUrl = "http://producttestapi.azurewebsites.net/api/products";
    var client = new HttpClient();
    var values = new Dictionary<string, string>()
        {
            {"Id", "6"},
            {"Name", "Skis"},
            {"Price", "100"},
            {"Category", "Sports"}
        };
    var content = new FormUrlEncodedContent(values);

    var response = await client.PostAsync(apiUrl, content);
    response.EnsureSuccessStatusCode();
person Darrel Miller    schedule 26.10.2013
comment
метод ajax имеет определенный 'dataType: json'. Это наводит меня на мысль, что контроллер по-прежнему принимает JSON в качестве данных. Я добавил метод, который обрабатывает добавление новых объектов в список. Я бы показал код конфигурации, это файл .cs из папки App_Start? Между тем, собираюсь попробовать подход, который вы разместили здесь. - person neo112; 27.10.2013
comment
Я смог использовать метод PostAsJson, также используя код, который вы дали, и теперь он работает. Большое спасибо, сэр! - person neo112; 27.10.2013
comment
Что мы можем сделать, если у нас есть такой параметр, как строковый массив в классе. Я не могу установить его в словарь, так как FormUrlEncodedContent не принимает словарь‹string, Object› - person Yasitha; 24.04.2015