【发布时间】:2023-02-10 15:00:14
【问题描述】:
我有一个用于验证的 Asp.Net Web 应用程序,扫描仪通过串口连接到它,每当扫描二维码时,它都会获取数据并刷新页面并使用从二维码获取的新数据。我现在的问题是,每当我扫描时,我的控制器功能都会收到数据,如下所示。
public void mySerialPort_Data(object sender, SerialDataReceivedEventArgs e)
{
try
{
string data = _serialPort.ReadExisting();
barcode = data.Split(";");
codeValue = barcode[0].Substring(barcode[0].IndexOf(":") +1);
SelectedPN(pn_No);
}
catch (IOException ex)
{
Console.WriteLine(ex);
}
}
我在上面的函数中调用了当前页面的controller函数选定的PN()我认为这个函数应该加载和刷新我从二维码中获得的数据,但我一直收到错误消息。 下面是在上面的函数中调用的 SelectedPN() 函数
public ActionResult SelectedPN(String nameobj)
{
pn_No= nameobj;
_serialPort.WriteTimeout = 500;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_Data);
if (!_serialPort.IsOpen)
{
try
{
_serialPort.Open();
}
catch (IOException ex)
{
Console.WriteLine(ex);
}
}
ViewBag.check9 = codeValue;
List <double> newList = new List<double>();
var num = 0;
var bill = 4;
var categoryFromDb = _db.Categories1.Where(j => j.MaterialNumber == nameobj);
foreach (var obj in categoryFromDb) {
newList.Add(obj.ComponentNumber);
}
num = newList.Count;
var duplicates = newList.GroupBy(x => x)
.SelectMany(g => g.Skip(1))
.Distinct()
.ToList();
ViewBag.check1 = check;
//testlist.Add(Convert.ToDouble(data1.X2));
ViewBag.check1 = check;
ViewBag.check2 = "background-color: #00FF00;";
ViewBag.check3 = 3;
ViewBag.check4 = num;
//ViewBag.check5 = '';
ViewBag.update = num;
changeValue = num;
ViewBag.check6 = testlist;
ViewBag.check7 = duplicates;
return View( categoryFromDb );
}
错误是它说我的 dbContext 实例已被处置,因此我无法使用它。
System.ObjectDisposedException: 'Cannot access a disposed context instance. A common cause of this error is disposing a context instance that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling 'Dispose' on the context instance, or wrapping it in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.
Object name: 'ApplicationDbContext'.'
我试过的我在网上发现 DbContext 的 ServiceLiftime 设置为范围默认情况下,它会在使用后处理实例,我必须将其更改为ServiceLifetime.Transient能够重用实例,但这没有用。我仍然再次遇到同样的错误
下面是我设置 ServiceLiftime 的地方
builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(
builder.Configuration.GetConnectionString("DefaultConnection")
), ServiceLifetime.Transient);
我将不胜感激有关如何解决此问题的任何帮助。
编辑
这是我的完整控制器
namespace WA4.Controllers
{
public class CategoryController : Controller
{
static SerialPort _serialPort = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);
public IEnumerable<Category> categoryFromDb;
public CategoryController(ApplicationDbContext db)
{
_db = db;
}
public IActionResult Index()
{
getPorts();
IEnumerable<Category> objCategoryList = _db.Categories1;
return View(objCategoryList);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult SelectedPN(String nameobj)
{
pn_No= nameobj;
_serialPort.WriteTimeout = 500;
_serialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_Data);
if (!_serialPort.IsOpen)
{
try
{
_serialPort.Open();
}
catch (IOException ex)
{
Console.WriteLine(ex);
}
}
ViewBag.check9 = codeValue;
List <double> newList = new List<double>();
var num = 0;
var bill = 4;
categoryFromDb = _db.Categories1.Where(j => j.MaterialNumber == nameobj);
foreach (var obj in categoryFromDb) {
newList.Add(obj.ComponentNumber);
}
num = newList.Count;
var duplicates = newList.GroupBy(x => x)
.SelectMany(g => g.Skip(1))
.Distinct()
.ToList();
return View( categoryFromDb );
}
下面是我的 DbContext.cs 内容
using WA4.Models;
using Microsoft.EntityFrameworkCore;
namespace WA4.Data
{
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
{
}
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
{
}
public DbSet<Category> Categories1 { get; set; }
}
}
我尝试使用@Walsharoo 建议的解决方案,但我得到了一个错误
using (ApplicationDbContext _db = new() )
{
categoryFromDb = _db.Categories1.Where(j => j.MaterialNumber == nameobj);
foreach (var obj in categoryFromDb) {
newList.Add(obj.ComponentNumber);
}
num = newList.Count;
var duplicates = newList.GroupBy(x => x)
.SelectMany(g => g.Skip(1))
.Distinct()
.ToList();
错误
InvalidOperationException: No database provider has been configured for this DbContext. A provider can be configured by overriding the 'DbContext.OnConfiguring' method or by using 'AddDbContext' on the application service provider. If 'AddDbContext' is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.
Microsoft.EntityFrameworkCore.Internal.DbContextServices.Initialize(IServiceProvider scopedProvider, DbContextOptions contextOptions, DbContext context)
Microsoft.EntityFrameworkCore.DbContext.get_ContextServices()
Microsoft.EntityFrameworkCore.DbContext.get_Model()
Microsoft.EntityFrameworkCore.Internal.InternalDbSet<TEntity>.get_EntityType()
Microsoft.EntityFrameworkCore.Internal.InternalDbSet<TEntity>.get_EntityQueryable()
Microsoft.EntityFrameworkCore.Internal.InternalDbSet<TEntity>.System.Linq.IQueryable.get_Provider()
System.Linq.Queryable.Where<TSource>(IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
WA4.Controllers.CategoryController.SelectedPN(string nameobj)
lambda_method86(Closure , object , object[] )
Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor+SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
【问题讨论】:
标签: c# asp.net .net asp.net-core