У меня была задача создать метод Add, а затем использовать этот метод в качестве конечной точки для вызова API через мое ядро ASP.NET. Все работало с пользовательским интерфейсом Swagger, но мне предложили создать свой собственный интерфейс, и я удалил Swagger и удалил все, что связано со Swagger, из конфигурации, и я переписал то, что мне было нужно. Теперь получаю ошибку...
Я ожидал получить результат, но вместо этого получил сообщение об ошибке
это мой контроллер
namespace APIProject.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class TextCalculatorController : ControllerBase
{
[HttpPost]
public string Calculate(string input)
{
return new TextCalculator().Add(input);
}
}
}
Это вызов API
document.getElementById("calculator-form").addEventListener("submit", async function (event) {
event.preventDefault();
const numbers = event.target.elements.numbers.value;
try {
const response = await fetch("http://localhost:44313/api/TextCalculator", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ numbers: numbers }),
});
if (!response.ok) {
throw new Error(response.statusText);
}
const result = await response.text();
document.getElementById("result").innerHTML = result;
} catch (error) {
document.getElementById("result").innerHTML = error.message;
}
});
Это метод:
public class TextCalculator
{
public string Add(string numbers)
{
if (string.IsNullOrWhiteSpace(numbers))
{
return "0";
}
string[] numberStrings = numbers.Split(',');
int[] numbersArray = new int[numberStrings.Length];
List<int> negativeNumbers = new List<int>();
for (int i = 0; i < numberStrings.Length; i++)
{
if (!int.TryParse(numberStrings[i], out numbersArray[i]))
{
throw new InvalidOperationException("Input must contain only digits.");
}
if (numbersArray[i] < 0)
{
negativeNumbers.Add(numbersArray[i]);
}
if (numberStrings[numberStrings.Length - 1].Length == 0)
{
throw new InvalidOperationException("Missing number in last position.");
}
}
if (negativeNumbers.Count > 0)
{
string negativeNumbersList = string.Join(", ", negativeNumbers);
throw new InvalidOperationException("Negative numbers not allowed: " + negativeNumbersList);
}
int result = 0;
foreach (int number in numbersArray)
{
result += number;
}
return result.ToString();
}
}
Можно ли найти проблему в этом файле json???
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:10089",
"sslPort": 44313
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "UI/index.html",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"APIProject": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"launchUrl": "UI/index.html",
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Кроме того, не могли бы вы поделиться подробностями TextCalculator().Add(input)
?
Соединение было сброшено. Это ошибка, которую я получаю в браузере.
Я добавил свой метод в вопрос и попробовал ваше решение, но оно не сработало. В любом случае, спасибо за ваше время.
Как ты пытался? Что именно не сработало? Вы получаете какую-либо ошибку в браузере? Не могли бы вы поделиться своим обновленным фрагментом кода? Не сработало означает, что он не попал в ваш контроллер или вы не получили ответа?
«Не удалось загрузить ресурс: net::ERR_CONNECTION_RESET» — ошибка в браузере. Я не думаю, что проблема заключается в контроллере, потому что, когда у меня был пользовательский интерфейс Swagger, у меня тоже был контроллер, и все работало нормально, но когда я стер Swagger и создал свой собственный пользовательский интерфейс, вместо результата я получаю «не удалось получить»
Вы не отправляете свой запрос из своего внешнего кода соответственно. Как я уже говорил вам ранее, если вы хотите сохранить свой контроллер как есть, измените код пользовательского интерфейса и отправьте запрос в строке запроса, например const response = await fetch("http://localhost:5094/api/TextCalculator?input = " + numbers
, и избавьтесь от body: JSON.stringify({ numbers: numbers }),
. Но если вы хотите сохранить свой код пользовательского интерфейса как есть, измените код вашего контроллера. . Вы не пытаетесь найти правильное решение.
Другая проблема может быть в браузере, очистите кеш в настройках браузера. Удалить все файлы cookie по одному.
Пробовал все. Думаю может проблема не в коде а в соединении или порте
Я почти уверен, что фрагмент кода является файлом, но это другая проблема. Вы пробовали с каким-то другим портом? Было бы здорово, если бы вы включили несколько журналов трассировки из сети с подробностями.
У меня была задача сделать метод Add и затем использовать этот метод как конечная точка для вызова API через мой ASP.NET Core. Все работало с пользовательским интерфейсом Swagger, но я должен был сделать свой собственный интерфейс, и я удалил Swagger и удалил все, что связано с Swagger, из конфигурации и я переписал то, что мне было нужно. Теперь я получаю ошибку
Что ж, ваше получение ошибки от контроллера довольно очевидно и логично, потому что вы отправляете свой запрос, используя тело запроса: в то время как ваш контроллер вообще не знает об этом и ожидает параметр в строке запроса как string input
.
Таким образом, для решения вашей проблемы у вас есть два варианта. Либо отправьте запрос из своего пользовательского интерфейса, используя строку запроса, либо обновите свой контроллер таким образом, чтобы он мог принять тело запроса.
Если вы хотите изменить Javascript:
В этом случае фрагмент кода вашего контроллера будет одинаковым в то же время, вам потребуется следующая модификация вашей функции запроса на выборку в Javascript:
const numbers = "100";
const response = await fetch("http://localhost:5094/api/TextCalculator?input = " + numbers, {
method: "POST",
headers: {
"Content-Type": "application/json",
},
});
console.info("Rquest Submitted");
if (!response.ok) {
throw new Error(response.statusText);
}
const result = await response.text();
console.info(result);
document.getElementById("result").innerHTML = result;
Примечание. Как вы можете заметить, если вы хотите отправить запрос в соответствии с определением вашего контроллера, вы должны отправить запрос в виде строки запроса, поскольку это api/TextCalculator?input=" + цифры, а тело не требует отправки. больше.
Выход:
Если вы хотите изменить контроллер в соответствии с [FromBody]:
Если вы хотите сохранить свой Javascript неизменным в этом сценарии, вам нужно изменить действие Calculate вашего контроллера таким образом, чтобы он мог принимать запрос [FromBody].
Контроллер:
[HttpPost]
public string Calculate([FromBody] FromBodyRequestModel model)
{
return new TextCalculator().Add(model.input);
}
Модель:
public class FromBodyRequestModel
{
public string input { get; set; }
}
Примечание. Более того, если вы хотите обновить действие контроллера в соответствии с кодом пользовательского интерфейса, вам нужно использовать [FromBody] в параметре действия контроллера и одну дополнительную модель запроса, которая в этом контексте — FromBodyRequestModel.
Выход:
Мистер Кирон, ваш ответ был правильным. После решения моей проблемы (я должен был использовать HTTPS вместо HTTP, поскольку мой порт был портом ssl), я заметил при отладке, что код не использует тело, поэтому я изменил код JS, и все заработало правильно. Большое спасибо.
Большое спасибо за ваш ответ и рад слышать, что ваша проблема была решена.
Не могли бы вы поделиться с нами, какую именно ошибку вы получаете? Вы проверили консоль или вошли в браузер?