【问题标题】:Program crashes due to stack overflow and access violation exceptions由于堆栈溢出和访问冲突异常导致程序崩溃
【发布时间】:2020-05-24 20:34:55
【问题描述】:

问题是每次我尝试链接多对多关系的相关表时,都会出现堆栈溢出和访问冲突异常。

这是我在调试控制台中收到的内容:

信息:Microsoft.Hosting.Lifetime[0] 现在收听:https://localhost:5001

信息:Microsoft.Hosting.Lifetime[0] 现在收听:http://localhost:5000

信息:Microsoft.Hosting.Lifetime[0] 申请开始。按 Ctrl+C 关闭。

信息:Microsoft.Hosting.Lifetime[0]

托管环境:开发

信息:Microsoft.Hosting.Lifetime[0] 内容根路径: C:\Users\vynar\source\repos\IndividualProjects\E_Library\API

堆栈溢出。

C:\Users\vynar\source\repos\IndividualProjects\E_Library\API\bin\Debug\netcoreapp3.1\ELibrary.API.exe(进程 14384)退出,代码为 -1073741819。


在 VS 输出窗口中(只有一部分):

Microsoft.Hosting.Lifetime:信息:内容根路径:> C:\Users\vynar\source\repos\IndividualProjects\E_Library\API 'ELibrary.API.exe'(CoreCLR: clrhost):已加载 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.1\System.Net.Security.dll'。

抛出异常:System.Net.Se``curity.dll 中的“System.IO.IOException”

抛出异常:System.Net.Security.dll 中的“System.IO.IOException”

抛出异常:System.Net.Security.dll 中的“System.IO.IOException”

抛出异常:System.Private.CoreLib.dll 中的“System.IO.IOException”

“ELibrary.API.exe”(CoreCLR:clrhost):加载“C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.1\System.Net.Http.dll”。

'ELibrary.API.exe' (CoreCLR: clrhost): 加载'C:\Users\vynar\source\repos\IndividualProjects\E_Library\API\bin\Debug\netcoreapp3.1\Microsoft.IdentityModel.Protocols.dll '。

'ELibrary.API.exe' (CoreCLR: clrhost): 加载'C:\Users\vynar\source\repos\IndividualProjects\E_Library\API\bin\Debug\netcoreapp3.1\Microsoft.IdentityModel.Protocols.OpenIdConnect .dll'。

“ELibrary.API.exe”(CoreCLR:clrhost):加载“C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.1\System.Net.WebSockets.dll”。

抛出异常:System.Net.Security.dll 中的“System.IO.IOException”

抛出异常:System.Private.CoreLib.dll 中的“System.IO.IOException”

抛出异常:System.Private.CoreLib.dll 中的“System.IO.IOException”

'ELibrary.API.exe' (CoreCLR: clrhost): 加载'C:\Users\vynar\source\repos\IndividualProjects\E_Library\API\bin\Debug\netcoreapp3.1\Microsoft.IdentityModel.JsonWebTokens.dll '。

'ELibrary.API.exe'(CoreCLR: clrhost):已加载'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.1\System.Runtime.Numerics.dll'。

“ELibrary.API.exe”(CoreCLR:clrhost):已加载“C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.1\System.Runtime.Serialization.Primitives.dll”。

“ELibrary.API.exe”(CoreCLR:clrhost):已加载“C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\3.1.1\Microsoft.AspNetCore.WebUtilities.dll”。

'ELibrary.API.exe' (CoreCLR: clrhost): 加载'C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App\3.1.1\Microsoft.AspNetCore.Http.Extensions.dll'。

程序“[14384] ELibrary.API.exe”已退出,代码为 -1073741819 (0xc0000005)“访问冲突”。

可能导致崩溃的代码:

控制器:

[Authorize(Roles = "Admin, Manager")]
    [HttpPost("attach")]
    public async Task<IActionResult> Attach([FromBody] AuthorBookModel authorBook)
    {
        var createdLink = await _service.Attach(authorBook.BookId, authorBook.AuthorId);
        if (createdLink == null)
        {
            return BadRequest(authorBook);
        }
        return CreatedAtAction(nameof(GetAllBooks), createdLink);
    }

服务

public async Task<AuthorBook> Attach(int bookId, int authorId)
    {
        var book = await _unitOfWork.Books.GetByIdAsync(bookId);
        var author = await _unitOfWork.Authors.GetByIdAsync(authorId);
        if (book == null && author == null)
        {
            return null;
        }
        var authorBook = new AuthorBook() { AuthorId = author.Id, BookId = book.Id };

        book.AuthorBooks.Add(authorBook);

        author.AuthorBooks.Add(authorBook);

        await _unitOfWork.CommitAsync();

        return authorBook;

    }

另外值得一提的是,代码有效,数据插入

【问题讨论】:

  • 这毫无意义。没有可见的递归,stackoverflow 需要递归。请提供更多信息 - 至少是堆栈跟踪。乍一看,错误不在您显示的代码中。没有递归就不能拥有stackoverflow。还要删除多余的标签。这个问题与 sql-server 无关(stackoverflow 不在服务器上),并且这里的 web 相关性为零。甚至 asp.net-core 也无关紧要,因为您的代码中没有代码行,也没有 asp.net core 的元素。
  • 这里有一个潜在的空引用异常,但没有访问冲突。

标签: c# .net asp.net-core


【解决方案1】:
var authorBook = new AuthorBook() { AuthorId = author.Id, BookId = book.Id };

book.AuthorBooks.Add(authorBook);

author.AuthorBooks.Add(authorBook);

这是代码异味。为什么要在 2 个不同表中的每个导航属性上触发保存新的 AuthorBook?

在这些表中,您只需存储 AuthorBookId,即使那样,也无需这样做。在 AuthorBooks 表中,仅存储 BookId 和 AuthorId。这样,您就可以让 AuthorBooks 表负责管理关系,而不是在每个表中都这样做。

尝试改变我所说的,然后告诉是否有任何错误。

【讨论】:

  • 我已经更改了代码,所以我删除了你所说的那些行并尝试将 AuthorBook 对象添加到 AuthorBook DbSet 但没有任何改变,仍然存在同样的问题
猜你喜欢
  • 2011-06-24
  • 2016-07-12
  • 1970-01-01
  • 2012-01-12
  • 2019-07-02
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多