12

我有一个带有控制器方法的 Blazor Webassembly 项目,如下所示:

[HttpGet]
    public async Task<List<string>> GetStatesForProfile()
    {
        IConfigurationSection statesSection = configuration.GetSection("SiteSettings:States");
        var sections = statesSection.GetChildren();
        var states = statesSection.GetChildren().Select(s => s.Key).ToList<string>();
        return states;            
    }

剃须刀页面调用此方法:

private async Task<bool> GetStatesModel()
{
    try
    {
        States = await http.GetJsonAsync<List<string>>("api/account/getstatesforprofile");            
        ...
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Exception: {ex.Message}, Inner: {ex.InnerException.Message}");
    }

我得到这个例外:

例外:“<”是值的无效开始。

我从 appsettings.json 文件中读取了这些值,并且值中没有“<”。

{      
  "SiteSettings": {    
    "States": {
      "New York": ["NYC"],
      "California": ["Los Angeles", "San Francisco"]
    }
 }

另外我在控制器方法中放置了一个断点,它没有命中。这是什么错误?是解析json吗?以及如何解决这个问题?

4

13 回答 13

6

您收到的响应很可能不是您请求的端点html的实际格式。JSON请检查一下。

作为 HTML 通常以<html>标记开头,JSON 验证器在第一个字符上失败。

于 2020-04-28T18:46:41.787 回答
5

我有一个非常相似的问题。

最后发现我的浏览器缓存了 HTML 错误页面(我猜我第一次尝试时代码有一些问题)。而且无论我如何尝试修复代码,我仍然只能从缓存中得到错误。清除我的缓存也清除了问题。

于 2021-01-14T14:37:39.030 回答
4

当您尝试访问不存在的 API 时会发生这种情况。您必须在 AppSettings 下检查您的 API 项目连接字符串,并确保它正确且正在运行。如果是 Blazor 项目,您可以将其设置为默认项目,执行并查看是否收到 json 响应。

于 2021-02-20T06:32:36.857 回答
2

此错误表示项目目标框架版本与机器上安装的运行时不匹配。因此,请确保您项目的目标框架与已安装的运行时匹配——这可以通过多种方式进行验证;其中之一是检查 Visual Studio 安装程序的单个组件选项卡并查找目标版本。

例如,TargetFrameworkproj文件中有属性:

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
  </PropertyGroup>

启动 Visual Studio 安装程序,单击修改,然后访问单个组件选项卡:

未安装所需的框架

安装缺少的运行时(在本例中为 .NET 5 运行时),一切顺利。

于 2021-11-30T00:09:21.747 回答
1

我知道这是一个老问题,但它是谷歌搜索错误时的最佳结果之一。

我只是花了比我愿意承认追查这个错误更多的时间。我有一个简单的 Blazor 托管应用程序,与模板基本没有变化。在本地运行时它工作得很好,但是当发布到我的 Web 主机 API 调用失败时。我终于发现问题在于我正在从客户端项目运行发布。当我更改为服务器项目时,它工作正常。

希望我长期的挫败感和轻微的愚蠢能够避免其他人犯下类似的错误。

于 2021-05-12T00:10:17.887 回答
1

似乎您的 api 无法访问,并且默认情况下它返回错误 HTML 页面。

您可以尝试以下解决方案:-

我认为您正在使用httpclient将数据获取到 blazor 应用程序。如果您在 blazor 和 web api 的解决方案中有单独的项目,则当前您的启动应用程序可能设置为仅运行 blazor 项目。将启动项目更改为多个(blazor 和 web api 应用程序)并httpClient在 blazor 应用程序的启动中提供 url,作为 webApi 应用程序 url,这可能会解决您的问题。

于 2021-06-14T09:30:55.920 回答
1

我得到了同样的错误。红鲱鱼。使用您的浏览器或邮递员检查您的 api 端点是否返回 json 数据而不是一些 HTML。在我的情况下,我的“api/companytypes”有一个错字。

private CompanyType[] companytypesarray;
private List<CompanyType> CompanyTypeList;
private List<CompanyType> CompanyTypeList2;
   
public async Task<bool> LoadCompanyTypes()
{
    //this works
    CompanyTypeList = await Http.GetFromJsonAsync<List<CompanyType>>("api/companytype");

    //this also works reading the json into an array first
    companytypesarray = await Http.GetFromJsonAsync<CompanyType[]>("api/companytype");
    CompanyTypeList2 = companytypesarray.ToList();

    return true;
}
于 2021-01-07T21:15:28.173 回答
0

我遇到了同样的问题,“JsonReaderException: '<' is an invalid start of a value.”

就我而言,REST 服务的 url 是错误的。

我正在使用来自客户端项目的 URL。然后我查看了Swagger屏幕,https:// localhost:44322 /swagger/index.html 并注意到正确的 URL 应该以“ 44322 ”开头......更正,有效。

于 2022-03-05T18:54:42.563 回答
0

为了匹配GetJsonAsync<List<string>>("api/account/getstatesforprofile");您的控制器应如下所示:

[Route("api/[controller]")]
[ApiController]
public class AccountController : ControllerBase
{

    [HttpGet("getstatesforprofile")]
    public IEnumerable<string> GetStatesForProfile()
    {
        return new[] { "foo", "bar" };

    }
} 

正如其他人已经提到的那样,Blazor Wasm 托管模板的服务器部分已配置为使您的 API 永远不会返回 404。您将被路由到 Blazor“此处无”页面。

然后你得到“HTML 不是 JSON”错误:'<' is an invalid start of a value

于 2021-05-20T19:36:54.313 回答
0

将空字符串传递给控制器​​方法时,我遇到了同样的问题。创建不接受任何输入变量的第二个控制器方法,并将空字符串传递给第一个方法有助于解决我的问题。

        [HttpGet]
        [ActionName("GetStuff")]
        public async Task<IEnumerable<MyModel>> GetStuff()
        {
            return await GetStuff("");
        }

        [HttpGet("{search}")]
        [ActionName("GetStuff")]
        public async Task<IEnumerable<MyModel>> GetStuff(string search)
        {
            ...
            
        }
于 2021-05-20T15:10:03.820 回答
0

您可能正在使用 Asp.NetCore 托管的 WASM 应用程序。默认情况下,客户端的 App.razor 具有类似于:

<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(Program).Assembly">
        <Found Context="routeData">
            <AuthorizeRouteView DefaultLayout="@typeof(MainLayout)"
                                RouteData="@routeData">
                <NotAuthorized>
                    <RedirectToLogin />
                </NotAuthorized>
                <Authorizing>
                    <Loading Caption="Authorizing..."></Loading>
                </Authorizing>
            </AuthorizeRouteView>
        </Found>
        <NotFound>
            <LayoutView Layout="@typeof(MainLayout)">
                <p>Sorry, there's nothing at this address.</p>
            </LayoutView>
        </NotFound>
    </Router>
</CascadingAuthenticationState>

问题就在这里。由于客户端和服务器共享相同的基地址,因此当应用程序找不到时"api/account/getstatesforprofile",它会为您提供客户端"Sorry, there's nothing at the address"页面。这当然是 HTML。

我还没有找到这个问题的解决方案,但我正在努力,一旦我发现问题就会回复。

于 2021-12-29T05:59:05.407 回答
0

包的版本

尝试将您的软件包更新到旧版本或新版本。就我而言,system.net.http.json 从 6.0 更新到 5.0

于 2021-11-12T14:30:59.590 回答
-1

在所有这些中,有两件事是我的问题并意识到,首先是缺少方括号的 Route[("api/controller")] 而不是 Route[("api/[controller]")]。在我做的第二个练习中,考虑到第一个经验,来自数据库的名称。数据库名称中有一个点 (Stock.Inventory)。当我将数据库名称更改为 StockInventory 时,它起作用了。第二个我不太确定,但它对我有用。

于 2021-08-26T14:13:08.577 回答