【发布时间】:2022-01-08 11:09:41
【问题描述】:
这是一个 Blazer 服务器应用程序,我无法使用 ApiService 从 Controller 获取值,我从 Index.razor 页面的 @code 部分调用 api 服务方法。
Index.razor
@code {
private List<SystemUser> systemUsers;
private List<RegisterUserModel> registerUserModels = new List<RegisterUserModel>();
private RegisterUserModel registerUserModel = null;
protected override async Task OnInitializedAsync()
{
try
{
systemUsers = await SystemUsersService.GetSystemUsers();
if (systemUsers != null && systemUsers.Count > 0)
{
foreach (SystemUser systemUser in systemUsers)
{
registerUserModel = new RegisterUserModel()
{
FirstName = systemUser.FirstName
,
LastName = systemUser.LastName
,
Email = systemUser.Email
,
UserName = systemUser.UserName
,
Password = systemUser.Password
};
registerUserModels.Add(registerUserModel);
}
}
}
catch (Exception exception)
{
Console.WriteLine("Error " + exception);
}
}
}
ApiService类
public class SystemUsersService
{
private readonly IHttpClientFactory _clientFactory;
public SystemUsersService(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task<List<SystemUser>> GetSystemUsers()
{
var result = new List<SystemUser>();
try
{
var url = string.Format("https://localhost:44391/systemusers/get");
var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Add("Accept", "application/json");
var client = _clientFactory.CreateClient();
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var stringResponse = await response.Content.ReadAsStringAsync();
result = JsonSerializer.Deserialize<List<SystemUser>>(stringResponse,
new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
}
else
{
result = Array.Empty<SystemUser>().ToList();
}
} catch (Exception exception)
{
throw exception;
}
return result;
}
}
}
控制器
namespace ServerWebAppForCW.Controllers
{
[ApiController]
[Route("[controller]")]
public class SystemUserController : ControllerBase
{
[HttpGet("/systemusers/get")]
public async Task<IEnumerable<SystemUser>> GetAll()
{
var model = new List<SystemUser>();
RegisterUserModel registerUserModel = new RegisterUserModel();
model = await registerUserModel.GetSystemUsers();
return model;
}
[HttpGet("/systemusers/create")]
public async Task<Boolean> CreateSystemUser(RegisterUserModel registerUserModel)
{
return await registerUserModel.CreateSystemUser();
}
}
}
从服务类的下面一行,我在这里得到的响应是内容中奇怪的 html doc 之类的东西,虽然状态代码是 200,但在调试时 SendAsync 不会调用控制器方法“GetAll( )'。所以我不知道这个调用从哪里获取数据。
var response = await client.SendAsync(request);
这是图片
继续前进,在他下面的行中抛出了一个错误
result = JsonSerializer.Deserialize<List<SystemUser>>(stringResponse,
new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
由于 JsonSerilizer 正在尝试反序列化 html 响应,因此哪种有意义。
异常错误图片
文字错误:
{"'<' is an invalid start of a value. Path: $ | LineNumber: 1 | BytePositionInLine: 0."}
所以我的问题是为什么我得到这个奇怪的 html 响应而不是 HttpClientFactory 调用没有调用我的控制器的 api?
希望有人能解释一下这种情况。
仅供参考我的启动注入
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddSingleton<WeatherForecastService>();
services.AddScoped<SystemUserService>();
services.AddSingleton<SystemUsersService>();
services.AddDbContext<AppDBContext>(item => item.UseSqlServer(Configuration.GetConnectionString("myconn")));
services.AddHttpClient();
}
【问题讨论】:
-
services.AddMvc()有帮助吗?
标签: asp.net asp.net-mvc asp.net-core blazor-server-side blazor-webassembly