Angular Post в Asp.Net (не Core) Web Api Ошибка 415 на IIS - PullRequest
0 голосов
/ 30 августа 2018

Я просто схожу с ума, заставляя работать простой веб-интерфейс, и я очень расстроен, потому что все гораздо сложнее, чем должно быть.

Я создал чрезвычайно простой Web Api (для тестирования), который используется клиентом Angular 6, и я смог заставить его работать, если я сам размещаю его локально, но если я публикую его в своем локальном IIS Win10 (что так будет работать при развертывании на сервере), тогда запрос к Web Api завершится с ошибкой 415 «Неподдерживаемый тип носителя».

Странная вещь в том, что если я сделаю запрос к автономной вкладке сети браузера Web Api (которая работает), это будет совсем не то же самое, что запрос к опубликованной версии IIS.

Это мой метод Web Api:

[HttpPost]
[HttpOptions]
public void Post([FromBody]Credentials cred)
{
    string strTest = "I'm doing just nothing";
}

Я должен упомянуть, что мне потребовалось целое утро, чтобы заставить его работать даже самостоятельно, из-за CORS, и ключом было добавление [HttpOptions] в заголовок метода.

Учетные данные класса:

public class Credentials {
    public string Username { get; set; }
    public string Password { get; set; }
}

Угловой почтовый индекс:

let headers={
    headers: new HttpHeaders({
        'Accept': 'application/json',
        'Content-Type': 'application/json; charset=UTF-8'
    })
}

return this.http.post<any>('http://localhost:9810/api/Login', JSON.stringify({username, password}), headers) ...

Информация о вкладке сети при самостоятельном размещении (рабочая):

General:
Request URL: http://localhost:9000/api/Login
Request Method: OPTIONS
Status Code: 204 No Content
Remote Address: [::1]:9000
Referrer Policy: no-referrer-when-downgrade

Response Headers:
Content-Length: 0
Date: Thu, 30 Aug 2018 09:24:50 GMT
Server: Microsoft-HTTPAPI/2.0

Request Headers:
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9,en;q=0.8
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: localhost:9000
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36

Информация о вкладке сети при публикации в локальном IIS (НЕ работает):

General:
Request URL: http://localhost:9810/api/Login
Request Method: OPTIONS
Status Code: 415 Unsupported Media Type
Remote Address: [::1]:9810
Referrer Policy: no-referrer-when-downgrade

Response Headers:
Content-Length: 801
Content-Type: application/json; charset=utf-8
Date: Thu, 30 Aug 2018 08:57:58 GMT
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET

Request Headers:
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: es-ES,es;q=0.9,en;q=0.8
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: localhost:9810
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36

Итак, как вы видите, когда Web Api публикуется в IIS, вывод на вкладке сети отличается, а заголовок не поступает.

Я полностью застрял и расстроил своих друзей. Пожалуйста, помогите.

Редактировать 1: я добавляю свой WebApiConfig, где вы можете видеть, что я включаю cors на всякий случай.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("http://localhost:4200", "*", "*");
        config.EnableCors(cors);
    }
}

1 Ответ

0 голосов
/ 30 августа 2018

Опять же, я никогда не пойму, почему все так сложно (а иногда и противоречиво), когда не должно.

Способ, которым я смог успешно выполнить запрос в автономном Web-интерфейсе, а также в IIS Web Api, состоял в том, чтобы заменить application / json на application / x-www-form-urlencoded, но почему? Это противоречие, так как я явно отправляю данные json.

В любом случае, это не работает, поэтому я отмечу свой вопрос как разрешенный.

let headers={
    headers: new HttpHeaders({
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    })
}
...