我在 appsettings.json 中有基本 URL,如下所示
"RM": {
"BaseAddress": "https://rm-dev.abc.org/"
},
在我嘗試呼叫此端點的類中
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.jsonappsettings.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>();
});
}

uj5u.com熱心網友回復:
您已經IConfiguration在您的服務中注入了一個并將其保存為_iconfiguration. 假設這不是空值,那么只需使用.GetValue來檢索一個值。
string baseAddress = _iconfiguration.GetSection("RM").GetValue<string>("BaseAddress");
閱讀有關ASP.Net 配置的更多資訊
好吧,這似乎_iconfiguration也是空的。
您在評論中指出您正在InventorySearchLogic 從控制器創建一個實體,例如
// inside controller logic
var searchLogic = new InventorySearchLogic(_context, _iconfiguration);
這是錯誤的做法。相反,您應該將此類注冊為 DI 服務(盡管您還應該添加一個介面,但現在沒有必要)。
在您的啟動ConfigureServices方法中,添加
services.AddTransient<InventorySearchLogic>();
然后不是手動創建型別的變數InventorySearchLogic,而是通過 DI 請求它
// your controller constructor
private readonly InventorySearchLogic searchLogic;
public MyController(InventorySearchLogic searchLogic)
{
this.searchLogic = searchLogic;
}
這樣,InventorySearchLogic 的建構式正確地獲取了它正在尋找的 DI 服務。您將不得不移動SMContext context. 也許將其移至方法的引數?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/472703.html
