【解決方法】"フレームがモジュールにありません" – "ロードされたモジュールで現在のスタック フレームが見つかりませんでした。 この場所のソースを表示できません"


ロードされたモジュールで現在のスタック フレームが見つかりませんでした。 この場所のソースを表示できません」

この問題は、API を呼び出すたびに発生しました

実際には、その時点で API が呼び出されるたびに応答を監視します。

API が失敗したか、使用中にリソースが見つかりませんでした

blazor webassembly の HttpClientInterceptor の概念。 これは、次の場合に使用できます

応答に失敗しました

HttpInterceptor :

C#
public class HttpInterceptorService
{
    private readonly HttpClientInterceptor _interceptor;
    private readonly NavigationManager _navManager;

    public HttpInterceptorService(HttpClientInterceptor interceptor, NavigationManager navManager)
    {
        _interceptor = interceptor;
        _navManager = navManager;
    }

    public void RegisterEvent() => _interceptor.AfterSend += InterceptResponse;

    privatevoid InterceptResponse(object sender, HttpClientInterceptorEventArgs e)
    {
        string message = string.Empty;
        if (!e.Response.IsSuccessStatusCode)
        {
            var statusCode = e.Response.StatusCode;

            switch (statusCode)
            {
                case HttpStatusCode.NotFound:
                    _navManager.NavigateTo("/404");
                    message = "The requested resorce was not found.";
                    break;
                case HttpStatusCode.Unauthorized:
                    _navManager.NavigateTo("/unauthorized");
                    message = "User is not authorized";
                    break;
                default:
                    _navManager.NavigateTo("/500");
                    message = "Something went wrong, please contact Administrator";
                    break;
            }

            throw new HttpResponseException(message);
        }
    }

    public void DisposeEvent() => _interceptor.AfterSend -= InterceptResponse;
}

API 呼び出し:

C#
 [inject]
HttpInterceptorService intercept;

intercept.RegisterEvent();

 var response= httpclient.Getasync(api/getproducts)

上記のAPI呼び出しの前に、モニターAPIのために以下の行を実行しようとしました

コードのデバッグ中に問題が発生したときの応答「フレームがモジュールにありません」-「現在のスタックフレームは、ロードされたモジュールに見つかりませんでした。この場所のソースを表示できません」
このため、インターセプターを使用して API が成功しなかった場合、httpsatus コードを確認できませんでした。

C#
intercept.RegisterEvent();

検索エンジンで多くの解決策を確認しましたが、機能していません

Visual Studio 2022を使用していました

私を助けてください。

ありがとう

私が試したこと:

コードのデバッグ中に問題が発生したときの応答「フレームがモジュールにありません」-「現在のスタックフレームは、ロードされたモジュールに見つかりませんでした。この場所のソースを表示できません」
このため、インターセプターを使用して httpsatus コードを確認できませんでした

解決策 1

HttpClientInterceptor DotNet にネイティブではありません。 通常、あなたは継承します HttpClientHandler また DelegatingHandler 実装する HttpClient SendAsync メソッドをラップするインターセプター。

このサードパーティのライブラリを使用していますか: GitHub – jsakamoto/Toolbelt.Blazor.HttpClientInterceptor: クライアント側の Blazor アプリケーションで送信中のすべての HTTP 要求をインターセプトします。[^]. はいの場合は、チケットを発行してそこで質問する必要があります。

アップデート: ここにあなたのための例があります…

1. サーバー:

C#
// sample endpoints with different test responses
app.MapGet("/ok", () => Results.Ok());
app.MapGet("/bad_request", () => Results.BadRequest());
app.MapGet("/unauthorized", () => Results.Unauthorized());

2. Blazor ミドルウェア:

C#
public class MyHttpClientHandler : DelegatingHandler 
{
    private readonly NavigationManager navigationManager;

    public MyHttpClientHandler(NavigationManager navigationManager)
    {
        this.navigationManager = navigationManager;
    }

    protected override async Task<HttpResponseMessage> SendAsync
    (
        HttpRequestMessage request,
        CancellationToken cancellationToken
    )
    {

        // Before call

        var response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);

        // After call
        Console.WriteLine($"[MyHttpClientHandler]
                            {(int)response.StatusCode} -
                            {response.StatusCode}");

        return response;
    }
}

3. Blazor Index.razor ページ:

HTML
@page "https://www.codeproject.com/"
@inject HttpClient httpClient

<h1>Hello, world!</h1>
<button @onclick="OKRequest">OKRequest Test</button>
<button @onclick="BadRequest">BadRequest Test</button>
<button @onclick="Unauthorized">Unauthorized Test</button>
<p>@status</p>
@code
{

    private string status = "--";

    Task OKRequest() => ProcessRequest("/ok");
    Task BadRequest() => ProcessRequest("/bad_request");
    Task Unauthorized() => ProcessRequest("/unauthorized");

    async Task ProcessRequest(string uri)
    {
        var result = await httpClient.GetAsync(uri);
        status = $"{(int)result.StatusCode} - {result.StatusCode}";
    }
}

4. Program.cs – ミドルウェアの登録

C#
builder.Services.AddTransient<MyHttpClientHandler>();

builder.Services.AddHttpClient
    (
        "HttpClientInterceptor.ServerAPI",
        client => client.BaseAddress = new 
            Uri(builder.HostEnvironment.BaseAddress)
    )
    .AddHttpMessageHandler<MyHttpClientHandler>();

ボタンを実行してクリックするときは、ブラウザ開発者コンソール ウィンドウまたは VS 出力ウィンドウを見て、 MyHttpClientHandler ミドルウェア。

お役に立てれば!

コメント

タイトルとURLをコピーしました