Почему некоторым методам API C# нужен [HttpPost], а некоторым он не нужен?

У меня есть два метода в одном файле контроллера для получения данных из JavaScript ajax.

Код первого API-контроллера C#:

public class News
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Intro { get; set; }
    public string Story { get; set; }
    public string Images { get; set; }
    public DateTime DateModified { get; set; }
    public DateTime DateCreated { get; set; }
}

public void InsertData([FromBody]News newsinfo)
{
    conn.ConnectionString = mdc.ConnectonString;
    cmd.Connection = conn;
    if (newsinfo.ID > 0)
    {
        cmd.CommandText = "UPDATE [News] SET [Title] = N'" + newsinfo.Title + "', [Intro] = N'" + newsinfo.Intro + "', [Story] = N'" + newsinfo.Story + "', [Images] = N'" + newsinfo.Images + "', [DateModified] = @DateModified WHERE [ID] = " + newsinfo.ID;
        cmd.Parameters.AddWithValue("@DateModified", DateTime.Now);

    }
    else
    {
        cmd.CommandText = "INSERT INTO [News] ([Title], [Intro], [Story], [Images], [DateCreated], [DateModified]) VALUES (N'" + newsinfo.Title + "', N'" + newsinfo.Intro + "', N'" + newsinfo.Story + "', '" + newsinfo.Images + "', @DateCreated, @DateModified)";

        cmd.Parameters.AddWithValue("@DateCreated", DateTime.Now);
        cmd.Parameters.AddWithValue("@DateModified", DateTime.Now);
    }
    conn.Open();
    int send = cmd.ExecuteNonQuery();
    conn.Close();
}

Вышеприведенный код будет получать данные из этого JavaScript

function InsertData() {
    var newsData = {
            ID: editingID,
            Title: $("#txbTitle").val().replace(/[\"]/gm, "\"").replace(/[\']/gm, "''"),
            Intro: $("#txbIntro").val().replace(/[\"]/gm, "\"").replace(/[\']/gm, "''"),
            Story: $(".ql-editor").html().replace(/[\"]/gm, "\"").replace(/[\']/gm, "''").replace(/http.//[a-z:0-9]+/gm, "").replace(//Images.Temp//gm, "/Images/News/"),
            Images: imagesToUpload.replace(/Temp/gm, "News")
   $.ajax({
       url: "api/Database/InsertData",
       method: "POST",
       data: newsData,
       success: function (result, status, xhr) {
           if (imagesToUpload != "") {
               var fileslist = {
                   filenames: ""
               }
               fileslist.filenames = imagesToUpload;
               console.info(fileslist);
               $.ajax({
                   url: "api/FileUpload/StoreImages",
                   method: "POST",
                   data: fileslist,
                   success: function (result, status, xhr) {
                       ViewState();
                   },
                   error: function (xhr, status, error) {
                       alert(error);
                   }
               });
           }
           else if (imagesToUpload == "") {
               ViewState();
           }
       },
       error: function (xhr, status, error) {
           alert(error);
       }
    });
}

Второй код контроллера C# API:

public class NewsId
{
    public int[] id { get; set; }
}

[HttpPost]
public void DeleteData([FromBody]NewsId newsId)
{
    conn.ConnectionString = mdc.ConnectonString;
    cmd.Connection = conn;
    if (newsId.id.Length > 0)
    {
        foreach (int id in newsId.id)
        {
            cmd.CommandText = "SELECT [Images] FROM [News] WHERE [Id] = " + id;
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            string images = "";
            while (reader.Read())
            {
                images = reader[0].ToString();
            }
            conn.Close();
            string[] files = Regex.Split(images, ";");
            foreach (string file in files)
            {
                if (file != "")
                {
                    string path = HttpContext.Current.Server.MapPath("~") + Regex.Replace(file, "/Images", "Images");
                    File.Delete(path); // /Images/Temp/
                }
            }

            cmd.CommandText = "DELETE FROM [News] WHERE [Id] = " + id;
            conn.Open();
            int d = cmd.ExecuteNonQuery();
            conn.Close();
        }
    }
}

И он получает данные из этого JavaScript

function DeletingNews(news_id) {
    var newsId = {
        id: news_id // news_id is Array 
    }
    $.ajax({
        url: "api/Database/DeleteData",
        method: "POST",
        data: newsId,
        success: function (result, status, xhr) {
            ViewState();
        },
        error: function (xhr, status, error) {
            alert(error);
        }
    });
}

Я не понимаю, почему Первому коду не нужно иметь [HttpPost], а второму коду это нужно, иначе Ajax вернется

405 method not allowed

Теперь оба работают нормально, но я просто не понимаю, почему одним нужен [HttpPost], а другим он не нужен?

вы должны поставить [HttpPost], даже если это не нужно..

João Paulo Amorim 24.05.2019 20:39
Поведение ключевого слова "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) для оценки ваших знаний,...
2
1
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

По умолчанию контроллер API обеспечивает получение, размещение, публикацию и удаление.

По умолчанию Get All, скажем, IEnumerable GetAll()

По умолчанию Get это строка Get(int id)

По умолчанию сообщение недействительно. Сообщение ([FromBody] значение объекта)

По умолчанию Put имеет значение void Put(int id,[FromBody]значение объекта)

По умолчанию удаление недействительно. Удалить (int id)

внимательно взгляните на используемую подпись и возвращаемые типы на их основе происходит действие.

так что теперь, если вы хотите добавить новое действие, скажем, Post, вам нужно украсить его атрибутом HttpPost, чтобы контроллер понял, какое действие вызывать

Наконец, я решаю эту проблему, просто читая Маршрутизация в статье веб-API ASP.NET.

Потому что имя моего метода API С# начинается с «Удалить», которое соответствует правилам глагола Http.

public void DeleteData([FromBody]NewsId newsId)
{
    conn.ConnectionString = mdc.ConnectonString;
    cmd.Connection = conn;
    if (newsId.id.Length > 0)

Мне просто нужно изменить метод Ajax с «POST» на «DELETE», как в приведенном ниже коде, тогда эта проблема будет решена.

function DeletingNews(news_id) {
    console.info(news_id);
    var newsId = {
        id: news_id
    }
    $.ajax({
        url: "api/Database/DeleteData",
        method: "DELETE", // <-- Changed from "POST"
        data: newsId,
        success: function (result, status, xhr) {
            ViewState();
        },
        error: function (xhr, status, error) {
            alert(error);
        }
    });
}

Или другое решение — изменить имя метода С# с «Удалить» на другое и сохранить метод Ajax с «POST», как в приведенных ниже кодах.

public void RemoveData([FromBody]NewsId newsId) // <-- Change method's name from "DeleteData" to "RemoveData"
{
    conn.ConnectionString = mdc.ConnectonString;
    cmd.Connection = conn;
    if (newsId.id.Length > 0)

function DeletingNews(news_id) {
    console.info(news_id);
    var newsId = {
        id: news_id
    }
    $.ajax({
        url: "api/Database/RemoveData", // <-- Change action url from "DeleteData" to "RemoveData"
        method: "POST",
        data: newsId,
        success: function (result, status, xhr) {
            ViewState();
        },
        error: function (xhr, status, error) {
            alert(error);
        }
    });
}

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