Различные заголовки в Angularjs и JQuery, в то время как POSTing для Web Api

Я разрабатываю небольшую часть для загрузки НЕСКОЛЬКИХ ФОТОГРАФИЙ, используя Asp.Net Web Api 2 для серверной части и Angularjs для клиентской стороны. Где-то на этом пути я наткнулся на кусок кода JQuery, который прекрасно работает, но когда я просто пишу ту же самую вещь, используя Angularjs, он ведет себя по-другому, с точки зрения сервера. Вот полное описание того, что происходит: Итак, следующий код показывает часть веб-API:

public async Task<string> PostAsync()
        {
            List<string> str = new List<string>();

            if (Request.Content.IsMimeMultipartContent())
            {
                // CASE 1...
            }
            else
            {
                // CASE 2...
            }

            return str;
        }

Итак, как вы можете видеть, оператор if разделяет два случая, которые доставляют мне неприятности. Теперь на стороне клиента, если я использую следующую часть JQuery и нажимаю на код веб-API, он всегда [успешно] заканчивается в СЛУЧАЕ 1:

var data = new FormData();
        for (i = 0; i < files.length; i++) {
            data.append("file" + i, files[i]);
        }
        $.ajax({
            type: "POST",
            url: scope.serviceBase + "api/Property/PostAsync",
            contentType: false,
            processData: false,
            data: data,
            success: function (response) {
                alert(response);
            },
            error: function () {
                alert("Error while invoking the Web API");
            }
        });

но если я использую идентичный Angularjs способ написания этого кода, он всегда заканчивается в CASE 2, что в основном неудачно:

var data = new FormData();
            for (i = 0; i < files.length; i++) {
                data.append("file" + i, files[i]);
            }
http.post(scope.serviceBase + 'api/Property/PostAsync', data, { headers: {'Content-Type':'multipart/form-data'} }).success(function (response) {
                alert(response);
            })
            .error(function (response) {
                alert(response);
            });

Теперь, что я заметил, используя маркеры на стороне веб-API, это то, что атрибут "тип контента", отправляемый на сервер, отличается в jquery и угловом коде. JQuery автоматически добавляет заголовок "content-type multipart/form-data border =blahblahblah...", который angularJS не делает.

Можете ли вы помочь мне понять, что это за фрагмент и почему он добавлен, а также как я могу заставить Angularjs отправлять правильный запрос, чтобы мой код на стороне сервера мог оказаться в CASE 1?

1 ответ

Решение

AngularJS по умолчанию попытается преобразовать ваш FormData Объект в JSON (см. https://code.angularjs.org/1.4.4/docs/api/ng/service/$http). Вы можете изменить это, поставив transformRequest: angular.identity в параметре параметров (см. https://code.angularjs.org/1.4.4/docs/api/ng/function/angular.identity).

Я не уверен, почему настройка 'Content-Type' заголовок к "multipart/form-data" явно не работает в этом случае, но это похоже на переопределение Angular по умолчанию "application/json" в undefined как предложено в https://code.angularjs.org/1.4.4/docs/api/ng/service/$http, делает свое дело.

В итоге попробуйте следующее:

$http.post(scope.serviceBase + 'api/Property/PostAsync', data,
        { transformRequest: angular.identity, headers: {'Content-Type':undefined} })
Другие вопросы по тегам