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

Posted

技术标签:

【中文标题】例外:“<”是一个无效的值开始【英文标题】:Exception: '<' is an invalid start of a value 【发布时间】:2020-08-12 16:26:22 【问题描述】:

我有一个 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吗?以及如何解决这个问题?

【问题讨论】:

【参考方案1】:

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

由于 HTML 通常以 &lt;html&gt; 标记开头,因此 JSON 验证器在第一个字符上失败。

【讨论】:

这怎么可能?该方法返回一个 List 并且显示的值不是 HTML? 您是否在收到回复后尝试打印States,以便确认它实际返回的内容? 我是服务器,我试图将代码放在另一个有效的操作方法中,在那里,值自然地显示在 List states = ... 但在客户端我面临一个异常同一行,无法打印接收到的数据。 问题出在源代码行:http.GetJsonAsync>,GetJsonAsync 期望常规类作为其类型参数而不是泛型类,因此 List 被视为常规类类不是泛型类,由于 .Net 不允许类名中包含小于字符,因此会引发此错误。【参考方案2】:

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

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

【讨论】:

我在搞乱 HTTP 端点,然后由于我的错误而出现重复的端点错误。在此之后,即使将我的代码恢复到较旧的工作版本,我也总是遇到与您相同的错误。唯一修复它的是按照您的回答并清除我的浏览器缓存。 哇哇哇。我今天至少浪费了一个小时。啊。请修复此 Blazor。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

例如,proj 文件中有TargetFramework 属性:

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

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

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

【讨论】:

【参考方案5】:

我遇到了同样的错误。红鲱鱼。使用您的浏览器或邮递员检查您的 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;

【讨论】:

正确答案。这条信息只是一条红鲱鱼。 Blazor 在绕过断点和吞噬错误消息方面做得非常出色。不要期望能够单步执行您的代码来找到您的问题。隔离 try 块中的每一行。删除 bin 和 obj 文件夹。重建。重新启动浏览器并清除缓存。重复直到你找到它或太老而无法继续.. 谢谢,是的。真的。频繁的浏览器缓存删除。 css 版本控制,多产的 try/except。当调试离开时 - 删除 BIN 和 OBJ 中的那些调试文件夹。【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

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

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

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

【讨论】:

我对 Blazor 比较陌生,就我而言,我创建了一个新页面来编辑“用户”(不是使用 MS-Identity 框架,只有一个简单的 SQL-DB 表)。我有两个更正要做。 (1) 我必须将 SQL-table-name 从 USER 更改为 USERS ,并且,将所有 C# 引用(重命名文件时很容易做到)从“USER”更改为“USERS”,因为“user”是 SQL 中的保留字-服务器。 (2)但是,作为新手,我“忽略”了添加一个 UsersController.cs(我确实添加了 REPOSITORY(服务器项目)和服务(客户端项目)。两次更正后,错误不再出现。感谢@Ameenrudheen。 K【参考方案8】:

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

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

        [HttpGet("search")]
        [ActionName("GetStuff")]
        public async Task<IEnumerable<MyModel>> GetStuff(string search)
        
            ...
            
        

【讨论】:

【参考方案9】:

为了匹配GetJsonAsync&lt;List&lt;string&gt;&gt;("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”错误:'

【讨论】:

【参考方案10】:

Versions of package

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

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案11】:

您可能正在使用 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。

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

【讨论】:

【参考方案12】:

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

【讨论】:

以上是关于例外:“<”是一个无效的值开始的主要内容,如果未能解决你的问题,请参考以下文章

try/catch 在网络图像上不起作用(例外:图像数据无效)

例外:预打包的数据库具有无效的架构

Java安全设置问题:程序被阻止,添加例外站点无效。

例外:oauth 状态丢失或无效。 (ASP.NET Core 外部标识符 OAuth)

Chrome无效的SSL证书安全警告

C#解析网站数据出错,显示错误为“0”的值对于“index”无效。“index”应介于 0 和 -1 之间。