Вызов API отлично работает на настольном компьютере, но не на мобильном устройстве.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Вызов API отлично работает на настольном компьютере, но не на мобильном устройстве.

Сообщение Anonymous »

У меня есть мобильное приложение, которое я создал с помощью React Native Expo. Серверная часть — это веб-API ASP.NET Core 8. Из мобильного приложения я пытаюсь сделать вызов API к серверной части, но это вообще не работает, вместо этого я получаю следующую ошибку:

Регистрация не удалось: ошибка сети

Я выполнил вызов API со своего рабочего стола с помощью Postman, и он работает отлично. Вызов не был сделан на localhost, он был сделан с использованием моего IPv4-адреса.
Я проверил IPv4-адрес со своего мобильного телефона с помощью приложения, и это сработало.
Затем я попытался позвонить с помощью Postman Web на своем мобильном устройстве, но получил ошибку:

Cloud Agent Ошибка: невозможно отправлять запросы на зарезервированный адрес. Убедитесь, что адрес общедоступен, или выберите другого агента.

что мне тоже не очень помогло.
Я также удалил UseHttpsRedirection(); из моего Program.cs в моей серверной части, так как я читал, что это может быть проблемой, но это не помогло.
Также я добавил .AllowAnyOrigin(), .AllowAnyHeader() и .AllowAnyMethod() в моем Program.cs в политиках CORS, но это тоже не помогло.
Итак, теперь я не уверен, в чем может быть проблема. Ниже у меня есть файл Program.cs из моей серверной части и немного кода React Native, который выполняет запрос.
Program.cs Внутренний код:
namespace Fitness_Tracker
{
using Fitness_Tracker.Data;
using Fitness_Tracker.Data.Models;
using Fitness_Tracker.Infrastructure;
using Fitness_Tracker.Services.Admins;
using Fitness_Tracker.Services.Consumables;
using Fitness_Tracker.Services.Meals;
using Fitness_Tracker.Services.Users;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using System.Text;

public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

builder.Services.AddIdentity()
.AddEntityFrameworkStores()
.AddDefaultTokenProviders();

builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();
builder.Services.AddTransient();

builder.Services.Configure(options =>
{
//@dev Change the options later. Current options are only for developement purposes
options.Password.RequireDigit = false;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
options.Password.RequiredLength = 6;
options.User.RequireUniqueEmail = true;
});

builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
};

options.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
context.Token = context.Request.Cookies["jwt"];
return Task.CompletedTask;
}
};
});

builder.Services.AddAuthorization(options =>
{
options.AddPolicy("RequireAdministratorRole", policy => policy.RequireRole("Administrator"));
});

builder.Services.AddControllers();

builder.Services.AddCors(options =>
{
options.AddPolicy("AllowReactApp",
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});

builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.Listen(System.Net.IPAddress.Any, 7009);
});

builder.Logging.AddConsole();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
DataSeeder.SeedActivityLevels(services).Wait();
DataSeeder.SeedAdministratorAsync(services).Wait();

}

/*app.UseHttpsRedirection();*/

app.UseCors("AllowReactApp");

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();

app.Run();
}
}
}

sign-up.jsx — код React Native Expo:
const handleContinue = async () => {
if (currentStage < 4) {
setCurrentStage(currentStage + 1);
} else {
try {
// Prepare registration data
const registrationData = {
fullName: name,
email: email,
password: password,
gender: gender.toUpperCase(),
weight: parseFloat(weight),
height: parseFloat(height),
age: parseInt(age),
activityLevel: {
name: activityLevels[activity],
},
weeklyWeightChangeGoal: manualKcal ? 0 : weightGoal,
};

// Send registration request
const response = await axios.post(
"https://my ipv4 address:7009/api/user/register",
registrationData
);

if (response.status === 200) {
router.push("/dashboard");
}
} catch (error) {
console.error(
"Registration failed:",
error.response?.data || error.message
);
}
}
};


Подробнее здесь: https://stackoverflow.com/questions/792 ... -on-mobile
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»