Asp.net core 在ASP.NET Core托管的Blazor应用程序中匿名调用服务器
我使用VS中包含的模板创建了Blazor Webassembly应用程序,具有授权和ASP.NET核心托管选项,如下所示: 我希望能够在不经过身份验证的情况下向服务器发出http请求。我通过注释掉Asp.net core 在ASP.NET Core托管的Blazor应用程序中匿名调用服务器,asp.net-core,asp.net-core-webapi,blazor,blazor-client-side,blazor-webassembly,Asp.net Core,Asp.net Core Webapi,Blazor,Blazor Client Side,Blazor Webassembly,我使用VS中包含的模板创建了Blazor Webassembly应用程序,具有授权和ASP.NET核心托管选项,如下所示: 我希望能够在不经过身份验证的情况下向服务器发出http请求。我通过注释掉[Authorize]属性更改了WeatherForecastController中的代码(甚至添加了[AllowAnonymous]属性): 我得到的例外是上面的代码。我怀疑问题出在App.razor的页面上,但无法解决 有什么帮助吗?有人在这里发布了一个答案,上面说问题出在客户项目的Program
[Authorize]
属性更改了WeatherForecastController
中的代码(甚至添加了[AllowAnonymous]
属性):
我得到的例外是上面的代码。我怀疑问题出在App.razor的页面上,但无法解决
有什么帮助吗?有人在这里发布了一个答案,上面说问题出在客户项目的Program.cs
文件的下面一行:
builder.Services.AddHttpClient("RclConsumer.ServerAPI", client => client.BaseAddress = new
Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
我把它放在自己的类库中的理由是,我计划添加Razor类库,我希望在整个解决方案中使用HttpClient
的单个实例,因为
@page "/fetchdata"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using StackOverflowAuthProblem.Shared
@*@attribute [Authorize]*@ @*CHANGED*@
@inject HttpClient Http
@*CHANGED Html removed for brevity*@
<div>Exception message: @exceptionMessage</div>
@code {
private WeatherForecast[] forecasts;
string exceptionMessage; //CHANGED
protected override async Task OnInitializedAsync()
{
try
{
forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
}
catch (AccessTokenNotAvailableException exception)
{
exceptionMessage = exception.Message; //CHANGED returns an empty string
exceptionMessage = exception.ToString(); //CHANGED returns
//Microsoft.AspNetCore.Components.WebAssembly.Authentication.AccessTokenNotAvailableException: '' at
//Microsoft.AspNetCore.Components.WebAssembly.Authentication.AuthorizationMessageHandler.SendAsync(HttpRequestMessage request,
//CancellationToken cancellationToken) at Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler.SendAsync(
// HttpRequestMessage request, CancellationToken cancellationToken)
//at System.Net.Http.HttpClient.SendAsyncCore(HttpRequestMessage request,
//HttpCompletionOption completionOption, Boolean async, Boolean emitTelemetryStartStop,
//CancellationToken cancellationToken)
//at System.Net.Http.Json.HttpClientJsonExtensions.<GetFromJsonAsyncCore>d__9`1[[StackOverflowAuthProblem.Shared.WeatherForecast[],
//StackOverflowAuthProblem.Shared, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext()
//at StackOverflowAuthProblem.Client.Pages.FetchData.OnInitializedAsync()
//in E:\StackOverflow\StackOverflowAuthProblem\StackOverflowAuthProblem\Client\Pages\FetchData.razor:line 53
//exception.Redirect(); CHANGE
}
}
}
builder.Services.AddHttpClient("RclConsumer.ServerAPI", client => client.BaseAddress = new
Uri(builder.HostEnvironment.BaseAddress))
.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();
public static class HttpClientService
{
public static HttpClient AnonymousHttpClient { get; set; }
static HttpClientService()
{
AnonymousHttpClient = new HttpClient();
#if DEBUG
AnonymousHttpClient.BaseAddress = new Uri("https://localhost:44395/");
#else
throw new Exception("Need the Base address here");
#endif
}
}