Решение
Я думаю, что проблема на самом деле была связана как с интерфейсом, так и с фоном.
Учебник Microsoft по веб-API 2 , похоже, не упоминает о его недостаткеподдержки заголовка OPTIONS, который генерируется некоторыми клиентами в качестве запроса «перед полетом».Кроме того, параметры, которые я использовал в Vue-Resource, также вызывали некоторые проблемы.
Back-end :
1. Я изменил поведение по умолчанию, которое заставляло сервер отбрасывать все запросы с помощью OPTIONSзаголовок в Global.asax.cs , спасибо Obelixx :
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
//Response.Flush();
Response.StatusCode = 200;
Response.AddHeader("Access-Control-Allow-Headers", "content-type,accept,authorization");
Response.AddHeader("Access-Control-Allow-Origin", "*");
Response.AddHeader("Access-Control-Allow-Credentials", "true");
Response.AddHeader("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE");
Response.AddHeader("Content-Type", "application/json");
Response.AddHeader("Accept", "application/json");
Response.End();
}
Я действительно не уверен, что это лучшее решение, я уверен, что есть идеальновеская причина, по которой программисты .net думали, что все запросы OPTIONS должны быть отброшены, это требует более глубокого изучения, поэтому используйте их с осторожностью.
2. как можно видеть здесь , я также добавилДействия OPTIONS в моем классе контроллера:
// OPTIONS: allow pre-flight
public HttpResponseMessage Options()
{
return new HttpResponseMessage { StatusCode = HttpStatusCode.OK };
}
front-end :
1. API vue-resource говорит, что имеет эту подпись для запроса POST:
post(url, [body], [config])
но также можно включить тело в параметре конфигурации.
хорошо, не работает для met.поэтому вместо этого:
this.$http.post('http://localhost:59837/api/Employees',
{params: {id: '2'}, body: credentials, method: 'POST', headers: {'Content-Type': 'text/plain'}})
Я сделал это:
this.$http.post('http://localhost:59837/api/Employees', credentials,
{headers: {'Content-Type': 'application/json'}})
обратите внимание, как я взял тело: учетные данные и просто использовал учетные данные в качестве отдельного аргумента.
2. Я также изменил заголовок «Content-Type» с text / plain на application / json (Microsoft говорит, что типы text / plain должны предотвращатьперед полетом, но это только привело к тому, что мой форматер json не смог выполнить синтаксический анализ учетных данных ).
----
Так что на данный момент это решение, как я уже говорил, что у меня есть исправления, связанные как с интерфейсом, так и с фоном, я не уверен, действительно ли было так много ошибок или просто еще не обнаруженныхЯ исправил во многих местах.
Надеюсь, это поможет другим людям.