[英]System.NullReferenceException on accessing the Base URL from the appSettings.json
我在 appsettings.json 中有 Base URL,如下所示
"RM": {
"BaseAddress": "https://rm-dev.abc.org/"
},
在 Class 中,我正在嘗試調用此端點
public class InventorySearchLogic
{
private readonly SMContext _context;
private readonly IConfiguration _iconfiguration;
public InventorySearchLogic(SMContext context, IConfiguration iconfiguration)
{
_context = context;
_iconfiguration = iconfiguration;
}
public InventorySearchLogic(SMContext context)
{
}
public async Task<string> GetRoomID(string roomName)
{
//string rmID = "";
using (var client = new HttpClient())
{
RmRoom retRoom = new RmRoom();
client.BaseAddress = new Uri(_iconfiguration.GetSection("RM").GetSection("BaseAddress").Value);
client.DefaultRequestHeaders.Accept.Clear();
調試時會拋出類似System.NullReferenceException: Message=Object reference not set to an instance of an object.
如何從 appsettings.json 訪問基礎 URL
我不確定如何使用ConfigurationBuilder()
,因為我有不同的 apSettings.json 文件,每個環境都有一個,例如appsettings.Development.json
、 appsettings.QA.json
、 appsettings.PROD.json
下面是我的啟動
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));
services.AddControllersWithViews();
services.AddSession();
services.AddMemoryCache();
services.AddDbContextPool<SurplusMouseContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("SMConnectionStrings"),
sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure();
});
});
services.AddHttpContextAccessor();
services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
services.AddRazorPages()
.AddMicrosoftIdentityUI();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseSession();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Customers}/{action=Index}/{id?}");
});
}
}
程序.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
您已經在服務中注入IConfiguration
並將其保存為_iconfiguration
。 假設這不是 null 值,那么只需使用.GetValue
來檢索一個值。
string baseAddress = _iconfiguration.GetSection("RM").GetValue<string>("BaseAddress");
閱讀有關ASP.Net 配置的更多信息
嗯,好像_iconfiguration
也是null。
您在評論中指出您正在從 controller創建InventorySearchLogic
的實例,例如
// inside controller logic
var searchLogic = new InventorySearchLogic(_context, _iconfiguration);
這是錯誤的做法。 相反,您應該將此 class 注冊為 DI 服務(盡管您還應該添加一個接口,但現在沒有必要)。
在您的 Startup 的ConfigureServices
方法中,添加
services.AddTransient<InventorySearchLogic>();
然后不是手動創建InventorySearchLogic
類型的變量,而是通過 DI 請求它
// your controller constructor
private readonly InventorySearchLogic searchLogic;
public MyController(InventorySearchLogic searchLogic)
{
this.searchLogic = searchLogic;
}
這樣,InventorySearchLogic 的構造函數就可以正確地獲取它正在尋找的 DI 服務。 您將必須移動SMContext context
。 也許將其移至方法的參數?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.