[ad_1]
ロードされたモジュールで現在のスタック フレームが見つかりませんでした。 この場所のソースを表示できません」
この問題は、API を呼び出すたびに発生しました
実際には、その時点で API が呼び出されるたびに応答を監視します。
API が失敗したか、使用中にリソースが見つかりませんでした
blazor webassembly の HttpClientInterceptor の概念。 これは、次の場合に使用できます
応答に失敗しました
HttpInterceptor :
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 呼び出し:
[inject]
HttpInterceptorService intercept;
intercept.RegisterEvent();
var response= httpclient.Getasync(api/getproducts)
上記のAPI呼び出しの前に、モニターAPIのために以下の行を実行しようとしました
コードのデバッグ中に問題が発生したときの応答「フレームがモジュールにありません」-「現在のスタックフレームは、ロードされたモジュールに見つかりませんでした。この場所のソースを表示できません」
このため、インターセプターを使用して API が成功しなかった場合、httpsatus コードを確認できませんでした。
intercept.RegisterEvent();
検索エンジンで多くの解決策を確認しましたが、機能していません
Visual Studio 2022を使用していました
私を助けてください。
ありがとう
私が試したこと:
コードのデバッグ中に問題が発生したときの応答「フレームがモジュールにありません」-「現在のスタックフレームは、ロードされたモジュールに見つかりませんでした。この場所のソースを表示できません」
このため、インターセプターを使用して httpsatus コードを確認できませんでした
解決策 1
HttpClientInterceptor
DotNet にネイティブではありません。 通常、あなたは継承します HttpClientHandler
また DelegatingHandler
実装する HttpClient
SendAsync メソッドをラップするインターセプター。
このサードパーティのライブラリを使用していますか: GitHub – jsakamoto/Toolbelt.Blazor.HttpClientInterceptor: クライアント側の Blazor アプリケーションで送信中のすべての HTTP 要求をインターセプトします。[^]. はいの場合は、チケットを発行してそこで質問する必要があります。
アップデート: ここにあなたのための例があります…
1. サーバー:
// sample endpoints with different test responses app.MapGet("/ok", () => Results.Ok()); app.MapGet("/bad_request", () => Results.BadRequest()); app.MapGet("/unauthorized", () => Results.Unauthorized());
2. Blazor ミドルウェア:
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 ページ:
@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 – ミドルウェアの登録
builder.Services.AddTransient<MyHttpClientHandler>(); builder.Services.AddHttpClient ( "HttpClientInterceptor.ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) ) .AddHttpMessageHandler<MyHttpClientHandler>();
ボタンを実行してクリックするときは、ブラウザ開発者コンソール ウィンドウまたは VS 出力ウィンドウを見て、 MyHttpClientHandler
ミドルウェア。
お役に立てれば!
[ad_2]
コメント