首页 > 解决方案 > .Net Core Web API Get函数不返回数据

问题描述

我有一个曾经可以工作的 .NET Core GET 函数,但无论出于何种原因,它不再返回数据。我已经在 Fiddler 中测试过了。我发誓自上次测试以来我没有更改函数本身的任何内容。我所做的唯一可能影响它的是将项目从 .Net Core 2.1 升级到 .Net Core 3.1。

获取函数:

[HttpGet]
[Produces(typeof(FrameImageDTO))]
public IQueryable GetAll()
{
    var results = from f in _context.Frames
    where f.Child.ParentId == LoggedInUser.ParentId
    select new FrameImageDTO(f);

    Request.HttpContext.Response.Headers.Add("X-Total-Count", _frameRepository.GetAll().Count().ToString());

    return results;
}

DTO:

public class FrameImageDTO
{
    public byte[] ImageData;

    public float XPosition;
    public float YPosition;
    public float ZPosition;
    public float XRotation;
    public float YRotation;
    public float ZRotation;
    public string FrameName;
    public long ChildId;

    public FrameImageDTO(Frames frame)
    {
        if (frame == null) return;

        XPosition = frame.XPosition;
        YPosition = frame.YPosition;
        ZPosition = frame.ZPosition;
        XRotation = frame.XRotation;
        YRotation = frame.YRotation;
        ZRotation = frame.ZRotation;
        FrameName = frame.FrameName;
        ChildId = frame.ChildId;

        // Retrieve file
        string filename = frame.Filename;

        FileStream fileStream = new FileStream(Path.Combine(Directory.GetCurrentDirectory(), "User Image Store", filename), FileMode.Open);
        var bytesToRead = (int)fileStream.Length;

        ImageData = new byte[bytesToRead];
        fileStream.Read(ImageData, 0, bytesToRead);
        fileStream.Close();
    }
}

当我在 GET 函数中设置断点来检查“结果”的内容时,它填充了数据,但是当我在 Fiddler 中对其进行测试时,没有数据。

编辑:

我记得我改变的是 Startup。我有另一个 Web API 项目,它的启动类比这个更干净,所以我用它作为清理这个的基础。这里有什么看起来不合适或丢失的东西吗?到目前为止,我已经尝试了所有方法,它似乎唯一想要返回的是一个 ObjectResult。

 public class Startup
 {
     public Startup(IConfiguration configuration)
     {
         Configuration = configuration;
     }

     public IConfiguration Configuration { get; }

     // This method gets called by the runtime. Use this method to add services to the container.
     public void ConfigureServices(IServiceCollection services)
     {
         services.AddScoped<ICountryRepository, CountryRepository>();
         services.AddScoped<IParentRepository, ParentRepository>();
         services.AddScoped<IChildRepository, ChildRepository>();
         services.AddScoped<IDiaryEntryRepository, DiaryEntryRepository>();
         services.AddScoped<IDiaryRepository, DiaryRepository>();
         services.AddScoped<IImageRepository, ImageRepository>();
         services.AddScoped<IFrameRepository, FrameRepository>();

         services.Configure<CookiePolicyOptions>(options =>
         {
             // This lambda determines whether user consent for non-essential cookies is needed for a given request.
             options.CheckConsentNeeded = context => true;
             options.MinimumSameSitePolicy = SameSiteMode.None;
         });

         services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer("Blah Blah"), ServiceLifetime.Transient);

         services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();

         services.AddHttpContextAccessor();
         services.AddControllers();
         services.AddRazorPages();

         services.AddHttpContextAccessor();
         services.AddControllers();

         services.ConfigureApplicationCookie(options =>
         {
             options.LoginPath = $"/Identity/Account/Login";
             options.LogoutPath = $"/Identity/Account/Logout";
             options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
         });

         services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
         services.AddSingleton<IEmailSender, EmailSender>();

         services.AddTransient<IPrincipal>(provider => provider.GetService<IHttpContextAccessor>().HttpContext.User);
     }

     // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
     public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
     {
         if (env.IsDevelopment())
         {
             app.UseDeveloperExceptionPage();
             app.UseDatabaseErrorPage();
         }
         else
         {
             app.UseExceptionHandler("/Home/Error");
             app.UseHsts();
         }

         app.UseAuthentication();

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

         app.UseRouting();

         app.UseEndpoints(endpoints =>
         {
             endpoints.MapControllerRoute(
                 name: "default",
                 pattern: "{controller=Home}/{action=Index}/{id?}");
             endpoints.MapRazorPages();
         });

         // For Unity WebGL integration
         app.UseFileServer();
         StaticFileOptions staticFileOptions = new StaticFileOptions()
         {
             FileProvider = new PhysicalFileProvider(
                 Path.Combine(Directory.GetCurrentDirectory(), @"Template")),
             RequestPath = new PathString("/template")
         };
         app.UseStaticFiles(staticFileOptions);
         FileExtensionContentTypeProvider contentTypeProvider = (FileExtensionContentTypeProvider)staticFileOptions.ContentTypeProvider ??
             new FileExtensionContentTypeProvider();
         contentTypeProvider.Mappings.Add(".unityweb", "application/octet-stream");
         staticFileOptions.ContentTypeProvider = contentTypeProvider;
         app.UseStaticFiles(staticFileOptions);

         // If Unity doesn't work, consider changing or deleting this line
         //app.UseStaticFiles(new StaticFileOptions
         //{
         //    FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "User Image Store")),
         //    RequestPath = "/ImageStore"
         //});

         //CreateRoles(serviceProvider);
     }


标签: .net-coreentity-framework-coreasp.net-core-webapi

解决方案


推荐阅读