Как исправить ошибку доступа к памяти Blazor WASM вне пределов?

Запустил новый проект Blazor WebAssembly (Windows 10, Visual Studio 2019), пытаясь получить простой список через HttpClient со стороны сервера.

Ошибка:

00755c3a:0xa3a0 Uncaught (in promise) RuntimeError: memory access out of bounds
    at malloc (<anonymous>:wasm-function[359]:0xa3a0)
    at monoeg_malloc (<anonymous>:wasm-function[161]:0x3c71)
    at stack_frag_new (<anonymous>:wasm-function[2019]:0x59758)
    at add_frag (<anonymous>:wasm-function[1430]:0x3ccf2)
    at interp_exec_method (<anonymous>:wasm-function[1120]:0x2f609)
    at interp_runtime_invoke (<anonymous>:wasm-function[5655]:0xf7391)
    at mono_jit_runtime_invoke (<anonymous>:wasm-function[5109]:0xddb3d)
    at do_runtime_invoke (<anonymous>:wasm-function[1410]:0x3ba85)
    at mono_runtime_try_invoke (<anonymous>:wasm-function[418]:0xcfdb)
at mono_runtime_invoke (<anonymous>:wasm-function[1610]:0x44b39)

На стороне сервера (возвращается правильно):

    [HttpGet]
    public async Task<IEnumerable<UserDetailsRM>> Get()
    {
        var users = await UserService.GetUsers();
        return users;
    }

на стороне клиента: ничего не отображает, несмотря на получение результатов.

<div class="userListWrapper">
        @if (Users != null)
        {
            <table class="table table-borderless" style="font-size:12px; font-family:arial; height: 
                500px; display:block;   overflow-y:scroll">
                <thead>
                    <tr>
                        <th scope="col">Profile</th>
                        <th scope="col">Full Name</th>
                        <th scope="col">Gender</th>
                        <th scope="col">Age</th>

                    </tr>
                </thead>

                @foreach (var user in Users)
                {
                    <tbody class="scrollableTable" style="border-radius:15px;">
                        <tr class="userRow" >
                            <td><img src="@user.ProfileImageUrl" style="width:30px;border- 
                             radius:30px" /></td>
                            <td>@user.FullName</td>
                            <td>@user.Gender</td>
                            <td>@user.Age</td>
                        </tr>

                    </tbody>
                }
            </table>
        }
  </div>

@code{

private IEnumerable<UserDetailsRM> Users;
string LoggedEmail;
string UserId;
string UserActionMessage = "No Logged User";
string Wanted = "";
protected async override Task OnInitializedAsync()
{
    Users = await Http.GetFromJsonAsync<IEnumerable<UserDetailsRM>>("user");
}
}

файл клиентского проекта:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
    <RazorLangVersion>3.0</RazorLangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="3.2.1" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="5.0.0-preview.6.20312.15" PrivateAssets="all" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="5.0.0-rc.2.20475.17" PrivateAssets="all" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
    <PackageReference Include="System.Net.Http.Json" Version="3.2.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\Domain\Domain.csproj" />
  </ItemGroup>
  
</Project>

файл проекта сервера:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="3.2.1" />
    <PackageReference Include="NetTopologySuite" Version="2.1.0" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\..\DataAccess\DataAccess.csproj" />
    <ProjectReference Include="..\Client\TeamAppManager.Client.csproj" />
  </ItemGroup>


</Project>

Был бы признателен за любую помощь. Спасибо.

Изменить: модели:

public class UserDetailsRM :  IIntEntity
{
  
    public int Id { get; set; }
    public int UserDetailsId { get; set; }
    public string UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime Birthdate { get; set; }
    public int UserGenderOptionId { get; set; }
    private string gender;
    public string Gender
    {
        get { return gender; }
        set
        {
            if (value == "1")
                gender = "Male";

            else if (value == "2")
                gender = "Female";

            else
                gender = "Other";
        }
    }
    public string FullName
    {
        get 
        {
            return $"{FirstName} {LastName}";
        }
        set
        {
            FullName = value;
        }
    }

    public int Age
    {
        get
        {
            var today = DateTime.Today;
            var age = today.Year - Birthdate.Year;
            if (Birthdate.Date > today.AddYears(-age)) age--;
            return age;
        }
    }

    public string ProfileImageUrl { get; set; }

    
}

person Zion Hai    schedule 22.10.2020    source источник
comment
Можете ли вы опубликовать код соответствующей модели (моделей) и UserService.GetUsers. У вас может быть проблема с циклической справкой ...   -  person enet    schedule 22.10.2020
comment
Добавлена ​​соответствующая модель   -  person Zion Hai    schedule 22.10.2020
comment
Свойство Gender не выполняет двусторонний обмен, это преобразование относится к другим целям.   -  person Henk Holterman    schedule 23.10.2020


Ответы (3)


Я предполагаю, что проблема связана с этим свойством, которое вызывает ошибку

public string FullName
    {
        get 
        {
            return $"{FirstName} {LastName}";
        }
        set
        {
            FullName = value;
        }
    }

Удалите установленный аксессуар и запустите свой код.

person enet    schedule 22.10.2020
comment
Эта модель работала с приложением Blazor Server как есть, но не с WASM. Это действительно была проблема. Спасибо! - person Zion Hai; 22.10.2020
comment
@ZionHai Это тоже не могло сработать на сервере. - person Henk Holterman; 26.10.2020
comment
В моем случае мне было присвоено значение другой переменной в методе набора, и я столкнулся с такой ошибкой, удалив работавший метод набора. Но почему это происходит? что, если нам нужны такие методы get set? - person venu; 13.04.2021
comment
Я думаю, проблема здесь в том, что средство доступа set пытается присвоить значение имени свойства, а не вспомогательному полю. Я предполагаю, что с этим не будет никаких проблем (требуется проверка), но источником доступа get не будет поле поддержки. Опять же, я только догадываюсь. Я могу ошибаться ... возможно, фреймворк этого не примет ... - person enet; 13.04.2021
comment
Проблема заключается в том, что он устанавливает FullName на себя, который устанавливает его на себя до бесконечности - так что в основном это бесконечная рекурсия, и ему не хватает памяти. По иронии судьбы именно это вызывает ошибки переполнения стека :) но спасибо за этот вопрос, поскольку он показывает мне, что я должен был сделать то же самое где-то в моем коде с недавним изменением, поскольку я также получаю эту ошибку, и да, это произошло бы где угодно код выполняется - даже на сервере Blazor - person Matthew Joughin; 02.06.2021

Ваши версии микширования WebAssembly.

  • 3.2.1
  • 5.0.0-превью.6.20312.15
  • 5.0.0-rc.2.20475.17
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="3.2.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="5.0.0-preview.6.20312.15" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="5.0.0-rc.2.20475.17" PrivateAssets="all" />

Для 3.2.1

<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="3.2.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Build" Version="3.2.1" PrivateAssets="all" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="3.2.1" PrivateAssets="all" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="System.Net.Http.Json" Version="3.2.0" />

Для 5.0 RC2

<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="5.0.0-rc.2.20475.17" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="5.0.0-rc.2.20475.17" PrivateAssets="all" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="System.Net.Http.Json" Version="5.0.0-rc.2.20475.5" />

Поскольку WASM запускается в вашем браузере, вам также следует очищать кеш приложений между изменениями dll.

person Brian Parker    schedule 22.10.2020
comment
Причина, по которой я попытался обновить, в первую очередь, заключалась в решении проблемы. Вернулся на 3.2.1, ничего не меняется. Проблема осталась. - person Zion Hai; 22.10.2020

Добавление к ответу @enet для подобных случаев в будущем требует определения такой локальной переменной, иначе это будет циклическая ссылка, которая в конечном итоге приведет к нехватке памяти:

    private string _Name
    public string Name
     {
      get 
       {
         //...
         return this._Name;
         
       }
      set
       {
         this._Name = value;
         //...
       }
     }
person A. Almazidi    schedule 23.04.2021