例外:“<”是一个无效的值开始
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 通常以 <html>
标记开头,因此 JSON 验证器在第一个字符上失败。
【讨论】:
这怎么可能?该方法返回一个 ListStates
,以便确认它实际返回的内容?
我是服务器,我试图将代码放在另一个有效的操作方法中,在那里,值自然地显示在 List我有一个非常相似的问题。
最后发现我的浏览器缓存了 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<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”错误:'
【讨论】:
【参考方案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 在网络图像上不起作用(例外:图像数据无效)