Я написал веб-API с mvc .net, но получаю ошибку 404

мой сценарий ниже

$(function () {
        $(".formSubmit").click(function () {
            var cName = $('#cName').val();
            var cSurname = $('#cSurname').val();
            var cEmail = $('#cEmail').val();
            var cMessage = $('#cMessage').val();
            console.info(cMessage);
            console.info(cEmail);
            console.info(cSurname);
            console.info(cName);
            if (cName != null && cName != '' && cSurname != null && cSurname != '' && cEmail != null && cEmail != '' && cMessage != null && cMessage != '') {
                $.ajax({
                    type: "GET",
                    url: "/api/contactusapi/" + cName + "/" + cSurname + "/" + cEmail + "/" + cMessage + "/?",
                    contentType: "json",
                    dataType: "json",
                    success: function (data) {
                        if (data != null) {

                        }
                    },
                    error: function (xhr) {
                        alert(xhr.responseText);
                    }
                });
            }
        });
    });

И мой API "contactusapi" ниже

namespace iskorumacom.Controllers
{
    public class ContactUsApiController : ApiController
    {
        [HttpGet]
        public int Get(string cName, string cSurname, string cEmail, string cMessage)
        {
            try
            {
                using (Data.DataClassesDataContext dc = new Data.DataClassesDataContext())
                {
                string cHTML =
                              "<h3></h3>" +
                              "<b>Ad:</b> " + cName + "<br />" +
                              "<b>Soyad :</b> " + cSurname + "<br />" +
                              "<b>e-Mail :</b> " + cEmail + "<br />" +
                              "<b>Mesaj :</b> " + cMessage;

                using (MailMessage MailMessageLocal = new MailMessage())
                {
                    MailMessageLocal.From =
                        new MailAddress("[email protected]", cName + " " + cSurname, System.Text.Encoding.UTF8);


                    MailMessageLocal.To.Add("[email protected]");

                    MailMessageLocal.Subject = "İletişim Formu Formu";
                    MailMessageLocal.IsBodyHtml = true;
                    MailMessageLocal.BodyEncoding = System.Text.Encoding.UTF8;
                    MailMessageLocal.Body = cHTML;
                    MailMessageLocal.Priority = MailPriority.High;

                    using (SmtpClient SmtpClientLocal = new SmtpClient())
                    {
                       
                        return -1;

                    }
                }


            }
        }
        catch
        {
            return 0;
        }
    }
  }
}

и моя папка route.config

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

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new string[] { "iskorumacom.Controllers" }
        );
    }

Вы не должны делиться своим кодом с вашими учетными данными для входа. Будь осторожен.

Muzaffer Galata 15.12.2020 06:21

О, спасибо. я не заметил

Melek 15.12.2020 06:26

Ваш URL-адрес Ajax имеет значение api. Попробуйте изменить свой route url на "api/{controller}/{action}/{id}" И вы можете использовать инструмент (например, Postman), чтобы проще протестировать свой API.

Muzaffer Galata 15.12.2020 06:34

"/api/contactusapi/get/" + cName + "/" + cSurname + "/" + cEmail + "/" + cMessage + "/?" нравиться? Пробовал, но выдает ту же ошибку

Melek 15.12.2020 06:53

Попробуйте это: url: "/api/ContactUsApi/Get?cName = " + cName + "&cSurname = " + cSurname + "&cEmail = " + cEmail + "&cMessage = " + cMessage,

Muzaffer Galata 15.12.2020 07:05

Я пробовал, но не получилось. Извините..

Melek 15.12.2020 07:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
6
138
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ваш контроллер наследуется от ApiController, но ваш маршрут настроен для контроллера MVC.

  1. Если вы хотите использовать ApiController, настройте маршрут, используя метод .MapHttpRoute.
  2. Если вы хотите настроить с помощью метода .MapRoute, наследуйте свой контроллер от Controller вместо ApiController.

Кроме того, в своем URL-адресе вы добавляете /api после своего хоста и порта. /api определяется в routeTemplate при определении вашего маршрута с помощью .MapHttpRoute, как показано ниже:

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

В вашем случае настройте свой WebApiConfig как -

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

А теперь вызовите свой API, используя URL /api/contactusapi?cName=myname&cSurname=mysurname&cEmail=myemail&cMessage=mymessage

Или, в качестве альтернативы, вы можете добавить атрибут Route к своему методу действия, как показано ниже:

namespace iskorumacom.Controllers
{
   public class ContactUsApiController : ApiController
   {
      [HttpGet]          
      [Route("api/contactus/{cName}/{cSurName}/{cEmail}/{cMessage}")]
      public int Get(string cName, string cSurname, string cEmail, string cMessage) {
         // Your code
      }
   }
}

А теперь назовите свой API как — /api/contactus/myname/mysurname/myemail/mymessage

Спасибо, я изменил свой route.config, но возвращаю ошибку, потому что я уже определил defaultapi в webapi.config.

Melek 15.12.2020 08:19

Можете ли вы опубликовать как свой RouteConfig, так и WebApiConfig? Также вы используете ApiController или Controller?

Nikhil Patil 15.12.2020 08:21

Я использую API-контроллер

Melek 15.12.2020 08:26

@Melek, если вы используете ApiController, используйте .MapHttpRoute tin WebApiConfig для настройки ваших маршрутов (здесь используйте имя как «DefaultApi»), оставьте свой .MapRoute таким, какой он есть в RouteConfig (используйте имя как «по умолчанию» здесь).

Nikhil Patil 15.12.2020 08:28

Я предполагаю, что мой маршрут и код webapi верны, потому что я использовал эти конфигурации раньше, и это работает, но теперь я работаю локально. Как вы думаете, ошибка может быть вызвана этим?

Melek 15.12.2020 08:35

Как выглядит ваш WebApiConfig? Если ваш routeTemplate "api/{controller}/{id}", вы можете вызвать свой контроллер, используя url = "api/contactusapi/get?cName = " + cName + "&cSurname = " + cSurname + "&cEmail = " + cEmail + "&cMessage = " + cMessage"; Можете ли вы также проверить, какой конечный URL-адрес вызывается на вкладке сети?

Nikhil Patil 15.12.2020 08:40

Я отредактировал свой ответ, пожалуйста, посмотрите.

Nikhil Patil 15.12.2020 09:27

он вернул «System.ArgumentException: маршрут« DefaultApi »уже находится в коллекции маршрутизации. Имена перенаправления должны быть уникальными».

Melek 15.12.2020 09:54

Проверьте, где вы уже определили «DefaultApi» в качестве имени маршрута, и измените его на другое. Если это для вашего route.config, измените его на «По умолчанию».

Nikhil Patil 15.12.2020 10:11

Я изменил значение по умолчанию в Route.Config, но оно не работает.

Melek 15.12.2020 10:25

Давайте продолжим обсуждение в чате.

Nikhil Patil 15.12.2020 10:26

WEBAPİ.КОНФИГ:

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

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}/{id2}/{id3}/{id4}/{id5}",
                defaults: new {
                    id = RouteParameter.Optional,
                    id2 = RouteParameter.Optional,
                    id3 = RouteParameter.Optional,
                    id4 = RouteParameter.Optional,
                    id5 = RouteParameter.Optional
                }
            );
        }

Это должно сработать, но это определенно не то, что вы должны делать.

Vince 15.12.2020 09:20

Согласно комментарию @Muzaffer Galata, вы должны изменить свой URL-адрес, чтобы он соответствовал вашей конечной точке, см. Фрагмент ниже.

$(function () {
    $(".formSubmit").click(function () {
        var cName = $('#cName').val();
        var cSurname = $('#cSurname').val();
        var cEmail = $('#cEmail').val();
        var cMessage = $('#cMessage').val();
        console.info(cMessage);
        console.info(cEmail);
        console.info(cSurname);
        console.info(cName);
        //change below
        if (cName != null && cName != '' && cSurname != null && cSurname != '' && cEmail != null && cEmail != '' && cMessage != null && cMessage != '') {
            $.ajax({
                type: "GET",
                url: "/api/ContactUsApi/Get?cName = " + cName + "&cSurname = " + cSurname + "&cEmail = " + cEmail + "&cMessage = " + cMessage,
                contentType: "json",
                dataType: "json",
                success: function (data) {
                    if (data != null) {

                    }
                },
                error: function (xhr) {
                    alert(xhr.responseText);
                }
            });
        }
    });
});

пробовал к сожалению не получилось

Melek 15.12.2020 09:28
Ответ принят как подходящий

Мы решили с @Nikhil Patil

Мой URL-адрес должен выглядеть так:

url :"/api/contactusapi/" + cName + "/" + cSurname + "/" + cEmail + "/" + cMessage

Спасибо за ваш комментарий и помощь!

Другие вопросы по теме