Asp.Net WebApi работает с GET, но не с POST

Я использую веб-формы Asp.Net с WebAPI 2. У меня есть метод, который работает с GET, но когда я использую POST, он не работает. Если вы видите ниже, внутри этого метода есть точка останова, и она даже не достигает ее при вызове POST. Как ни странно, когда я использую Postman для проверки метода, он работает с POST. Что я делаю не так?

Мой код jquery

$.ajax({
   url: 'MyController/GetUserDetail',
   type: 'POST',
   async: true,
   dataType: 'json',
   data:
   {
      "search": myvariable
   },
    success: function (response) {
   }
});

Мой метод веб-API. При использовании [HttpGet], а также изменении jquery с POST на GET, это работает. Но для POST этот метод никогда не вызывается, поскольку точка останова никогда не срабатывает, и я также не получаю никаких ошибок.

[HttpPost]
public User GetUserDetail(string search)
{      //breakpoint here
}

Моя конфигурация маршрута

public static void Register(HttpConfiguration config)
{
   config.MapHttpAttributeRoutes();

   config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "{controller}/{action}/{id}",
      defaults: new { id = RouteParameter.Optional }
   );
}

person Frank Martin    schedule 11.02.2020    source источник
comment
I don't receive any error either в ответе будет ошибка. Вы можете использовать вкладку сети консоли, чтобы найти ее, сделав запрос в своем JS-коде.   -  person Rory McCrossan    schedule 11.02.2020
comment
как выглядит действие GET? возможно ли, что он проглатывает ваш запрос (возможно, у него нет атрибута [HttpGet])?   -  person LongChalk    schedule 11.02.2020
comment
1) проверьте правильность URL-адреса (вкладка сети браузера) - если вы развернули его, возможно, потребуется MyApp/MyController/MyAction использовать @Url.Action("GetUserDetail", "MyController"), чтобы быть уверенным (но не в том случае, если он находится в файле .js). 2) Удалите атрибут [HttpPost] (по крайней мере, на данный момент, чтобы исключить его), если у вас нет других перегрузок - в любом случае это не должен быть POST, поскольку это явно GET GetUserDetail.   -  person freedomn-m    schedule 11.02.2020
comment
@LongChalk добавление [HttpGet] будет ограничивать для GET, а не указывать, что это метод получения. Если есть только один метод (как подразумевается, но не указан в ОП), то ему не нужен [HttpGet]   -  person freedomn-m    schedule 11.02.2020
comment
@freedomn-m, возможно, это вообще не проблема GET/POST? возможно, вы вызываете его из другой области/контроллера в почтальоне и на стороне клиента? Вы рассматривали возможность его отладки, посмотрев на F12/Network? или запросить «MyController/GetUserDetail/»?   -  person LongChalk    schedule 11.02.2020
comment
Да, я проверю через F12/Network завтра, когда пойду на работу.   -  person Frank Martin    schedule 11.02.2020


Ответы (2)


Похоже на проблему с CORS. Чтобы обрабатывать CORS для веб-API, добавьте следующие настройки в файл web.config веб-API в разделе ‹system.webServer›:

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
    </customHeaders>
</httpProtocol>

Но существует риск безопасности, связанный с включением CORS. Хорошее объяснение здесь< /а>.

Необходимо еще одно изменение в вашем JavaScript. Существует странная проблема с настройкой «data» для $.ajax(), поэтому вам нужно вставить значение параметра в «url» в виде строки запроса:

url: 'MyController/GetUserDetail?search=' + myvariable,
person as-if-i-code    schedule 11.02.2020
comment
Я использую .Net 4.6.2, и кажется, что это известная проблема (поскольку я видел несколько сообщений об этом без решения) с ней или она связана с некоторыми настройками, как вы написали выше о CORS. Я использую аутентификацию Windows. Тот же код отлично работает в более ранних версиях .Net. Завтра проверю эту настройку CORS. - person Frank Martin; 12.02.2020

с параметром поиска строки вы не указали [FromBody] или [FromUri], поэтому по умолчанию он принимается как fromUri для параметров строкового типа. и вы передаете параметр в теле. поэтому попробуйте отправить параметр в виде строки запроса...

person Dhaval padmani    schedule 26.02.2020