首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Blazor服务器依赖项注入问题

Blazor服务器依赖项注入问题
EN

Stack Overflow用户
提问于 2022-12-03 10:16:53
回答 1查看 29关注 0票数 0

我对Blazor相当陌生,但我目前正在尝试从我创建并部署为Nuget包的类库中访问一些类。作为背景,Nuget包是一个Api库,它允许我与一个webservice对话(我不知道这是否相关)。然而,每次我去测试的页面,页面从来不加载,而是我离开浏览器加载圈,直到我导航或关闭应用程序。在这里进行测试时,我的接口的@inject调用似乎是导致问题的原因,因为当我删除并尝试正常加载页面时,页面就会这样做。

因此,为了演示我的设置,这里是我将单例添加到DI中的地方:

代码语言:javascript
复制
builder.Services.AddSingleton<IApiConfigHelper, ApiConfigHelper>();
builder.Services.AddSingleton<IApiHelper, ApiHelper>();
builder.Services.AddSingleton<ISystemEndpoint, SystemEndpoint>();

然后,在blazor页面上,我的页面顶部有以下声明:

代码语言:javascript
复制
@using Library.Endpoints
@using Library.Models

@page "/"

@inject ISystemEndpoint _systemEndpoint

现在我倾向于这与Nuget软件包有关,并与DI一起使用。我已经测试了远离这个项目的库(在控制台应用程序中),并且可以确认它是否正常工作。

我还创建了一个本地类库作为测试,以查看是否可以将数据访问类注入到页面中,并且我可以确认这没有问题,这表明DI正在工作,而不是在我的Nuget包中。

考虑到Nuget包正在访问外部域,我确实查看了CORS,并在应用程序中设置了以下简单的CORS策略:

代码语言:javascript
复制
builder.Services.AddCors(policy =>
{
    policy.AddPolicy("OpenCorsPolicy", opt =>
        opt.AllowAnyOrigin()
        .AllowAnyHeader()
        .AllowAnyMethod());
});

它在AddRouting调用之后添加到应用程序中,如下所示:

代码语言:javascript
复制
app.UseCors("OpenCorsPolicy");

然而,这并不是解决问题的方法,所以如果有人能为我指出正确的方向,我可能会错在哪里或提供任何建议,我将非常感激。

编辑1-提供有关SystemEndpoint的详细信息@mason查询,构造函数将被注入2样东西,如下所示:

代码语言:javascript
复制
public SystemEndpoint(IApiHelper apiHelper, IOptions<UriConfigModel> uriOptions)
{
    _apiHelper = apiHelper;
    _uriOptions = uriOptions.Value;
}

我的Nuget库依赖于以下内容:

  • Azure.Identity
  • Azure.Security.KeyVault.Secrets
  • Microsoft.AspNet.WebApi.Client
  • Microsoft.Extensisons.Options.ConfigurationExtensions

编辑2-对此进行一些进一步的测试,我向Nuget库添加了一个简单的Endpoint类,它返回一个带有基本消息的字符串,并返回2 UriConfig属性的值,如下所示。我将这个测试添加到1)我的DI是否正常工作的正常检查中,以及2)检查从added分配给我的UriConfig对象的值。

代码语言:javascript
复制
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调用:

代码语言:javascript
复制
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%。作为一个结束的想法,它是否是简单的东西,当我调用上述方法,它没有等待?

EN

回答 1

Stack Overflow用户

发布于 2022-12-03 23:56:56

因此,在坚持这样做之后,它失败的原因似乎是“等待”对Azure KeyVault的调用,这种调用是通过ApiConfigHelper.的构造函数间接发生的。获得KeyVault值的结果方法现在是:

代码语言:javascript
复制
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调用非常好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74665753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档