Веб-API Почтовый звонок от Ajax не удается - PullRequest
0 голосов
/ 29 июня 2018

У меня есть веб-интерфейс API, и я называю его методом в ajax с методом POST, отправляя параметр в виде данных. Это дает мне ошибку 404. Не найдено.

Но когда я передаю данные в строке запроса, все работает нормально. Помогите мне исправить проблему и заставить ее работать при вызове метода с данными в теле, а не строкой запроса.

Примечание. Веб-приложение и Web-API работают на разных портах

Отправка объекта конкретного типа в строке запроса также не работает и принимается в веб-API как ноль

конфигурация

<httpProtocol>
          <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*" />
            <add name="Access-Control-Allow-Headers" value="Content-Type, contentType, data" />
            <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
          </customHeaders>
</httpProtocol>

Контроллер

 public class RiskController : ApiController
    {

метод

[HttpGet, HttpPost]
    public DashboardContainerViewModel GetDashboardContainer(string token)
    {

Ajax call

var postData = { token: priv.secToken };        

$.ajax({
            type: 'POST',
            url: 'http://localhost:48060/api/Risk/GetDashboardContainer',
            dataType: 'json',
            contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
            data: postData,
            success: function (data) {
                pub.dashboardHeader(data.Name);
                var defaultTab = _.find(data.Dashboards, function (tab) {
                    return tab.IsDefault == true;
                });

И я получаю ПОСТ http://localhost:48060/api/Risk/GetDashboardContainer 404 (Не найдено)

Заголовки запросов Fiddler

POST http://localhost:48060/api/Risk/GetDashboardContainer HTTP/1.1
Host: localhost:48060
Connection: keep-alive
Content-Length: 142
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json, text/javascript, */*; q=0.01
Origin: http://localhost:10452
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:10452/Authorised/DashBoard/DashBoard.aspx
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

token=ETvgg0YH4sx9w%2FiQL5560S20Ja4jGix%2FiBTOFGpQCliYZVilmtKiXPbk30d8FTYbhUWyFqz8%2FqT1pmI0oY6rzDGQ7krL6d2fDKDKwJhfCNFXZxnv%2BPCUj5ki5eizdWOM

Заголовки ответов Fiddler

HTTP/1.1 404 Not Found
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcRGVmYXVsdENvbGxlY3Rpb25cQ0FNTVNfUHJvZHVjdHNcX1JlbGVhc2VcMTQxMExSLUFNXFdlYiBTZXJ2aWNlXENBTU1TLlNBQVMuV2ViQVBJXENBTU1TLlNBQVMuSVJNV2ViQVBJXGFwaVxSaXNrXEdldERhc2hib2FyZENvbnRhaW5lcg==?=
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type, contentType, data
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Date: Fri, 29 Jun 2018 05:47:22 GMT
Content-Length: 215

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:48060/api/Risk/GetDashboardContainer'.","MessageDetail":"No action was found on the controller 'Risk' that matches the request."}

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Ваш метод Controller использует параметр простого типа. WebApi будет искать простой параметр в URL запроса. Поэтому, если вы хотите использовать параметр POST, вы должны указать WebApi просмотреть тело запроса.

public DashboardContainerViewModel GetDashboardContainer([FromBody] string token)

Но вам также необходимо изменить формат данных, которые вы отправляете. Данные простого типа, отправляемые как application/x-www-form-urlencoded, должны быть в формате '=value', а не 'token=value'

var postData = "=testData"; 
0 голосов
/ 29 июня 2018

Это наиболее неожиданно из-за ошибки маршрутизации, по моему мнению и опыту. Вы пытались посмотреть RouteConfig.cs, чтобы убедиться, что он устанавливает правильные маршруты для вашего API? Примерно так:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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



}
...