Angular $http.post 1.6.1 не передает данные в WebAPI

Все, я только что создал новый пакет Angular, используя 1.6.1, но теперь данные, похоже, не передаются моему WebAPI. Однако, когда я публикую биты через SoapUI или что-то в этом роде, все нормально.

Javascript выглядит так:

function testapi()
        {
            var serviceRoot='http://server/testangular16/api/Values';

            var deferred=$q.defer();

            var req = {
                method: 'POST',
                url: serviceRoot,
                data: 'PassInTheText'
            };

            $http(req).then(goodResponse,badResponse);

            return deferred.promise;
        };
    function goodResponse(response)
    {
        console.log("Good response");
        console.log(response);

    }

    function badResponse(response)
    {
        console.log("Bad response");
        console.log(response);
    }

а webapi — это очень простой контроллер C#:

    // POST api/values
    public HttpResponseMessage Post([FromBody]string value)
    {
        HttpResponseMessage rp = new HttpResponseMessage(HttpStatusCode.OK);
        rp.Content = new StringContent(value);

        return rp;
    }

Я делаю это в контроллере, я могу установить точку останова и ударить по частям, где я могу посмотреть значение. Это всегда ноль.

Глядя на трассировку сети, угловая часть выполняет предварительную проверку, и я вижу ответ 200.

Request URL:http://server/testangular16/api/Values
Request Method:OPTIONS
Status Code:200 OK
Remote Address:10.7.14.209:80
**Response Headers view source**
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:content-type
Access-Control-Allow-Origin:http://localhost:8000
Cache-Control:no-cache
Content-Length:0
Date:Fri, 03 Feb 2017 18:09:04 GMT
Expires:-1
Pragma:no-cache
Server:"Management Corporation"
X-AspNet-Version:4.0.30319
**Request Headers view source**
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:mjvzrx3
Origin:http://localhost:8000
Referer:http://localhost:8000/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36

Итак, похоже, что я передаю CORS, но когда я пытаюсь передать данные в качестве содержимого сообщения, это не получается.

Любые идеи, что мне не хватает?

Спасибо, Ник


person Nick Jacobs    schedule 03.02.2017    source источник


Ответы (2)


Веб-API ожидает объект в теле сообщения, вы не можете передать примитивный тип, если не используете application/x-www-form-urlencoded в качестве типа содержимого и не ставите перед значением знак равенства =.

Таким образом, вы можете исправить это одним из этих методов

  1. Настройте параметр c# и превратите его в тип со строковым свойством, а затем отправьте объект json с соответствующим именем параметра.
  2. Измените запрос на тип контента с кодировкой URL и добавьте = к значению переменной.
  3. Отправьте его как часть URL-адреса вместо тела сообщения, вы все равно можете использовать метод POST.

Изменить на form-urlencoded

function testapi()
{
    var serviceRoot='http://server/testangular16/api/Values';
    var deferred=$q.defer();

    var req = {
        method: 'POST',
        url: serviceRoot,
        data: '=PassInTheText', // added =
        contentType: 'application/x-www-form-urlencoded' // specify content type
    };

    $http(req).then(goodResponse,badResponse);
    return deferred.promise;
};
person Igor    schedule 03.02.2017
comment
Я думаю, тогда что-то не сходится. Единственное место, где мне нужен знак =, это если я звоню из Angular 1.6. Я только что попробовал в почтальоне, и мне вообще ничего не пришлось делать дополнительно. Тело — это просто какой-то фиктивный текст. То же самое с SoapUI. Если я использую его для публикации данных, а тело такое же, тогда все работает нормально. Это заставляет меня поверить, что это действительно что-то в Angular 1.6, а не WebAPI. Кроме того, я отправляю свой тип контента как application/json..... - person Nick Jacobs; 03.02.2017
comment
И я только что откатился на Angular 1.5.11, и он работает так же, как и... Итак, единственная переменная - это Angular 1.6.... - person Nick Jacobs; 03.02.2017
comment
‹Хорошо, мне нужно посмотреть, как разместить код в комментариях› - person Nick Jacobs; 03.02.2017
comment
Я собираюсь начать с нуля и посмотреть, смогу ли я повторить. В противном случае я, вероятно, в конечном итоге перейду к ответу, который я опубликовал - person Nick Jacobs; 03.02.2017

Кажется, если я это сделаю, это сработает, как и ожидалось.... Мысли?

    // POST api/values
    public HttpResponseMessage Post(HttpRequestMessage request)
    {
        var data = request.Content.ReadAsStringAsync().Result;

        Console.WriteLine("Data: {0}", data);

        HttpResponseMessage rp = new HttpResponseMessage(HttpStatusCode.OK);
        rp.Content = new StringContent("Data back from WebAPI" + data);

        return rp;
    }
person Nick Jacobs    schedule 03.02.2017