【问题标题】:Not getting a valid json from controller Get没有从控制器获取有效的 json
【发布时间】: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);

这是图片

response-of-api-call

继续前进,在他下面的行中抛出了一个错误

result = JsonSerializer.Deserialize<List<SystemUser>>(stringResponse,
        new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });

由于 JsonSerilizer 正在尝试反序列化 html 响应,因此哪种有意义。

异常错误图片

Exception-error-image

文字错误:

{"'<' 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


【解决方案1】:
services.AddRazorPages()

不提供对 API 的支持。

要提供 API 路由,请使用以下任一方法:

services.AddMvc();
services.AddControllers();
services.AddControllersWithViews();

AddControllers 是支持 API 的最小实现。

https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio#mvc-service-registration

【讨论】:

  • 还是不行,控制器永远不会激活
【解决方案2】:

我在我的 Startup.cs 的 ConfigureServices 方法末尾添加了这个相关代码

services.AddMvc(options => options.EnableEndpointRouting = false).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

配置服务:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddRazorPages();
            services.AddServerSideBlazor();
            services.AddSingleton<WeatherForecastService>();
            services.AddScoped<SystemUserService>();

            //This one AddMvc
            services.AddMvc(options => options.EnableEndpointRouting = false).SetCompatibilityVersion(CompatibilityVersion.Version_3_0);

            services.AddDbContext<AppDBContext>(item => item.UseSqlServer(Configuration.GetConnectionString("myconn")));
            services.AddScoped<HttpClient>();
        }

还将这一行添加到 Startup.cs 类的 Configure 方法中的“app.UseRouting();”之后。

app.UseMvcWithDefaultRoute();
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();

            app.UseMvcWithDefaultRoute();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapBlazorHub();
                endpoints.MapFallbackToPage("/_Host");
            });
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2012-07-24
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多