如何解决错误:Asp.Net 请求中出现意外的令牌“<”?

Posted

技术标签:

【中文标题】如何解决错误:Asp.Net 请求中出现意外的令牌“<”?【英文标题】:How to resolve Error: Unexpected token '<' in Asp.Net request? 【发布时间】:2020-04-05 02:22:18 【问题描述】:

我试图在我的 ASP. Net 应用程序中调用 WebService 并收到以下错误:Error: Unexpected token '&lt;'。到目前为止,这似乎是一个json 解析问题,但我不确定如何解决它。在我的应用程序中,我有一个数据管理器,它从本地 SQL .mdf 数据库调用存储过程。本质上,它是一个名为 GetEventsByState() 的公共 DataTable,它存储在我的 DataAcessManager.cs 文件中。它是从我的 App_Service.asmx.cs 文件中的 WebService 调用的。目标是在WebService 中将datatable 作为json 返回,这样我就可以在我的app.js 文件中调用它:

RII_Service.cs

    [WebMethod]
    public string GetListOfEventsByState()
    
        _dtMgr = new DataAccessManager();
        //string state = st;
        /*HttpContext.Current.Response.Write(GetEventsData());*/
        DataTable EventsList = _dtMgr.GetEventsByState();
        var lst = EventsList.AsEnumerable()
            .Select(r => r.Table.Columns.Cast<DataColumn>()
                .Select(c => new KeyValuePair<string, object>(c.ColumnName, r[c.Ordinal])
                ).ToDictionary(z => z.Key, z => z.Value)
            ).ToList();
        //now serialize it
        try
        
            string json = new javascriptSerializer().Serialize(lst);
            json = json.TrimEnd();
            return json;
        
        catch (Exception e)
        
            throw new Exception(e.Message);
        
    

然后在页面加载时在app.js 中调用此WebMethod,如下所示:

app.js

//Function to call Asp.Net Web Service and retrieve events list by state
var EventsData = esriRequest(
    url: "RII_Service.asmx/GetListOfEventsByState",
    content: 
    ,
    dataType: "jsonp",
    handleAs: "json"
);
EventsData.then(
    function (response) 
        console.log(response);
        events_json = response;
....
, function (error) 
    console.log("Error: ", error.message);
); 

当我在 RII_Service.cs 上为 WebMethodGetListOfEventsByState() 设置断点时,它会生成一个可行的 json 字符串,如下所示:

"[\"FullEventName\":\"NJ Cindy 2005\",\"State\":\"NJ\",\"FullEventName\":\"NJ Gordon 2000\",\"State\":\"NJ\"...]

但是,当它返回EventsData 请求时,它会直接出现错误。关于我在这里做错的任何线索或建议。

【问题讨论】:

收到该错误时检查响应。根据我的经验,这通常表明您期待的是 JSON 响应,但却得到了 html 响应(例如服务器错误)。 错误响应并没有给我更多的error = SyntaxError: Unexpected token '&lt;' ,但它似乎确实拖入了HTML &lt;string&gt; 标记,这就是引发错误的原因。关于如何解决这个问题的想法?我的request 中的app.js 中是否有不正确的设置(jsonp?)? 但是来自服务器的响应是什么? 嘿@Matt U,我想通了。请看下面我的回答。您对 HTML 响应的看法是正确的。 【参考方案1】:

这似乎是在调用 RII_Service.cs 中的 WebMethod 时将 xml/html 拉到app.js 请求的问题。尽管GetListOfEventsByState() 显示json string 被返回,&lt;string&gt; 标签总是会在app.js 一侧被拾取(从而解释'&lt;' 错误)。为了解决这个问题,我做了两件事。首先,使用NewtonSoft.Json方法将其序列化JsonConvert

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

*您可能必须先使用“工具”>“NuGet 包”来安装它。然后我使用System.Web.HttpContext 来格式化输出。因此,我按如下方式重新设计了我的 WebMethod GetListOfEventsByState() 并且它起作用了。希望这对遇到类似问题的人有所帮助:

    [WebMethod]
    //public string GetListOfEventsByState()
    public void GetListOfEventsByState()
    
        _dtMgr = new DataAccessManager();
        DataTable EventsList = _dtMgr.GetEventsByState();

        //now serialize it
        try
        
            string JSONresult;
            JSONresult = JsonConvert.SerializeObject(EventsList);
            HttpContext.Current.Response.Write(JSONresult);
        
        catch (Exception e)
        
            throw new Exception(e.Message);
        
    

【讨论】:

以上是关于如何解决错误:Asp.Net 请求中出现意外的令牌“<”?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 angularjs $http 修复我的 jsonp 回调以解决“意外令牌”错误?

IIS 发布ASP.NET程序时运行出错,求大神帮忙看看

SyntaxError:在 asp.net 中的 ajax 调用中位置 4 的 JSON 中的意外令牌 <

ASP.NET Microsoft OWIN 令牌变得无效

Asp.net core 2 - 不记名令牌出现 401 错误

不记名令牌出现 401 错误 - asp.net core 3.1