我正在 .NET 8 上使用 Blazor Wasm。我第一次尝试将我的应用程序发布到开发服务器和 QA 服务器。我遇到了一个问题,所有 API 调用都失败。查看网络跟踪,我可以看到 API 的基本 url 被切断。
我的基本网址是这样的:
"BaseFakeApiUrl": "https://dev.FakeSite.com/IisSiteName"
所以在这个例子中
/IisSiteName
被切断了。我确实对 url 进行了更改(在 FakeSite 中添加了 2)以验证我是否在正确的文件中。我还尝试在 /
之后添加 IisSiteName
。
我不知道为什么 iis 站点名称被切断,任何指导将不胜感激。
编辑:我注意到
appsettings.json
显示在我的网络跟踪中,首先它显示 appsettings.development.json
并检查预览,它为基本 url 设置了正确的 url。然后它加载了 appsettings.json
,但没有加载。我对其进行了更改,使其具有正确的 url,该 url 反映在我的网络跟踪中,但 API 调用仍然缺少 IIS 站点名称
编辑2:这是我如何使用它
我有我的 appsettings.development.json (我通过向子域添加 2 并检查它是否出现在网络跟踪中来确认正在使用它)
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"BaseServiceCompanyApiUrl": "https://dev.test.com/IisSiteName"
}
我使用 Program.cs 中的应用程序设置来注入具有基本 url 的 HttpClient
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.Configuration.GetValue<string>("BaseServiceCompanyApiUrl")) });
builder.Services.AddHttpClient<ServiceCompanyServices>(x => { x.BaseAddress = new Uri(builder.Configuration.GetValue<string>("BaseServiceCompanyApiUrl")); });
builder.Services.AddHttpClient<AuthorizationService>(x => { x.BaseAddress = new Uri(builder.Configuration.GetValue<string>("BaseServiceCompanyApiUrl")); });
然后在我的服务中我这样做
public class AuthorizationService
{
private readonly HttpClient client;
public AuthorizationService(HttpClient client)
{
this.client = client;
}
public async Task<UserAuthInfo>GetUserAuthInfo()
{
var url = "/Authenticate/GetUserAuthInfo";
return await GenericApiServices.GetFromAPI<UserAuthInfo>(client, url);
}
}
使用 GetUesrAuthInfo() 时,我可以在网络跟踪中看到它正在调用 https://dev.test.com/Authenticate/GetUserInfo,请注意它缺少基本 url 中的 /IisSiteName。
编辑 3。我意识到我没有包含 GenericApi 方法,所以就在这里。请注意,调试时调用 GetAsync() 时的 url 是正确的
public static class GenericApiServices
{
public static async Task<T> GetFromAPI<T>(HttpClient client, string url)
{
var response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
return await response.Content.ReadFromJsonAsync<T>();
else if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
{
Console.WriteLine("Throwing File Not Found Exception");
var errorMessage = await response.Content.ReadFromJsonAsync<string>();
if (String.IsNullOrEmpty(errorMessage))
errorMessage = "File Not Found";
throw new FileNotFoundException(errorMessage);
}
else
{
var errorMessage = await response.Content.ReadFromJsonAsync<string>();
if (String.IsNullOrEmpty(errorMessage))
errorMessage = "An Error occured.";
throw new Exception(errorMessage);
}
}
我的一位同事在这里找到了解决方案:https://github.com/dotnet/runtime/issues/29309
问题是基本 url 必须以 / 结尾,我已经尝试过了,但您还必须确保传递给 GetAsync 的 url 不以 / 开头。我原以为它会向我显示一个 URL,其中的基数是正确的,并且带有额外的 /,但事实并非如此
TLDR:将 / 添加到基本 url 的末尾,从传递给 GetAsync() 的 url 开头删除 /