我对Blazor相当陌生,但我目前正在尝试从我创建并部署为Nuget包的类库中访问一些类。作为背景,Nuget包是一个Api库,它允许我与一个webservice对话(我不知道这是否相关)。然而,每次我去测试的页面,页面从来不加载,而是我离开浏览器加载圈,直到我导航或关闭应用程序。在这里进行测试时,我的接口的@inject调用似乎是导致问题的原因,因为当我删除并尝试正常加载页面时,页面就会这样做。
因此,为了演示我的设置,这里是我将单例添加到DI中的地方:
builder.Services.AddSingleton<IApiConfigHelper, ApiConfigHelper>();
builder.Services.AddSingleton<IApiHelper, ApiHelper>();
builder.Services.AddSingleton<ISystemEndpoint, SystemEndpoint>();然后,在blazor页面上,我的页面顶部有以下声明:
@using Library.Endpoints
@using Library.Models
@page "/"
@inject ISystemEndpoint _systemEndpoint现在我倾向于这与Nuget软件包有关,并与DI一起使用。我已经测试了远离这个项目的库(在控制台应用程序中),并且可以确认它是否正常工作。
我还创建了一个本地类库作为测试,以查看是否可以将数据访问类注入到页面中,并且我可以确认这没有问题,这表明DI正在工作,而不是在我的Nuget包中。
考虑到Nuget包正在访问外部域,我确实查看了CORS,并在应用程序中设置了以下简单的CORS策略:
builder.Services.AddCors(policy =>
{
policy.AddPolicy("OpenCorsPolicy", opt =>
opt.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod());
});它在AddRouting调用之后添加到应用程序中,如下所示:
app.UseCors("OpenCorsPolicy");然而,这并不是解决问题的方法,所以如果有人能为我指出正确的方向,我可能会错在哪里或提供任何建议,我将非常感激。
编辑1-提供有关SystemEndpoint的详细信息@mason查询,构造函数将被注入2样东西,如下所示:
public SystemEndpoint(IApiHelper apiHelper, IOptions<UriConfigModel> uriOptions)
{
_apiHelper = apiHelper;
_uriOptions = uriOptions.Value;
}我的Nuget库依赖于以下内容:
编辑2-对此进行一些进一步的测试,我向Nuget库添加了一个简单的Endpoint类,它返回一个带有基本消息的字符串,并返回2 UriConfig属性的值,如下所示。我将这个测试添加到1)我的DI是否正常工作的正常检查中,以及2)检查从added分配给我的UriConfig对象的值。
public class TestEndpoint : ITestEndpoint
{
private readonly IOptions<UriConfigModel> _uriConfig;
public TestEndpoint(IOptions<UriConfigModel> uriConfig)
{
_uriConfig = uriConfig;
}
public string TestMethod()
{
return $"You have successfully called the test method\n\n{_uriConfig.Value.Release} / {_uriConfig.Value.Version}";
}
}但是,当将IApiHelper的依赖项添加到Ctor中时,该方法会中断,并无法加载页面。查看IApiConfigHelper.,Ctor有一个依赖项被注入到它的ApiHeloer中。查看实现,ApiConfigHelper的Ctor正在设置HttpClient的值和参数,这些值和参数应该对外部Api进行其余的调用。
现在我相信在这一点上破坏代码的是我正在打电话给Azure Key Vault,通过REST,拔出秘密值连接到Api。对KeyVault的调用是通过以下方法编排的,使用了KeyVault Nuget包,但是我假设它的核心是代表我对Azure进行REST调用:
private async Task<KeyVaultSecret> GetKeyVaultValue(string secretName = "")
{
try
{
if (_secretClient is not null)
{
var result = await _secretClient.GetSecretAsync(secretName);
return result.Value;
}
}
catch (ArgumentException ae)
{
Console.WriteLine(ae.Message);
}
catch (Azure.RequestFailedException rfe)
{
Console.WriteLine(rfe.Message);
}
return new(secretName, "");
}所以这就是我现在的立场。我仍然认为这可能要归功于CORS,因为在打电话给外部服务/域时,它似乎要崩溃了,但我仍然可以说是100%。作为一个结束的想法,它是否是简单的东西,当我调用上述方法,它没有等待?
发布于 2022-12-03 23:56:56
因此,在坚持这样做之后,它失败的原因似乎是“等待”对Azure KeyVault的调用,这种调用是通过ApiConfigHelper.的构造函数间接发生的。获得KeyVault值的结果方法现在是:
private KeyVaultSecret GetKeyVaultValue(string secretName = "")
{
try
{
if (_secretClient is not null)
{
var result = _secretClient.GetSecret(secretName);
if (result is not null)
{
return result.Value;
}
}
}
catch (ArgumentException ae)
{
Console.WriteLine(ae.Message);
}
catch (Azure.RequestFailedException rfe)
{
Console.WriteLine(rfe.Message);
}
return new(secretName, "");
}我现在能够成功地调用我的库,并从它交互的Api返回值。
我还可以确认,这个不是CORS问题。一旦我看到删除等待是有效的,然后我从服务和应用程序中删除CORS策略声明,在我的Blazor的启动代码,一切都继续工作,没有任何问题。
最后,我必须强调,当我能够使用库时,这似乎只是一个问题(可能是webApi项目),因为我能够使用库,在控制台应用程序中等待Azure调用非常好。
https://stackoverflow.com/questions/74665753
复制相似问题