WCF 跨域使用 Jsonp 错误未捕获语法错误:意外令牌:

Posted

技术标签:

【中文标题】WCF 跨域使用 Jsonp 错误未捕获语法错误:意外令牌:【英文标题】:WCF Cross Domain Using Jsonp Error Uncaught SyntaxError: Unexpected token : 【发布时间】:2013-09-20 05:55:52 【问题描述】:

我正在尝试使用 jQuery 跨域调用 web 服务。

这是我调用服务的代码

 $(document).ready(function () 
        $.ajax(
            type: 'GET',
            async: false,
            contentType: "application/json",
            url: "http://localhost:52136/Service1.svc/Helloworld?callback=func_callbk",
            dataType: "jsonp",
            success: function (data) 
                alert('sucesss')
                alert(data.d);
            ,
            error: function (data) 
                alert(data);
            
        );
    );

    func_callback = function (data) 
        alert(data.data.people[0].id);
    

我正在从服务返回简单的字符串。

public string HelloWorld()

    return "Hello World";

服务被调用,但我收到错误

Uncaught SyntaxError: Unexpected token :

在 Chrome 的控制台窗口中。

我在从浏览器调用服务时得到这个字符串:

"HelloWorldResult":"Hello World"

请让我知道我哪里出错了?

提前致谢。

【问题讨论】:

@DipeshParmar 分号在 javascript 中不是必需的,仅推荐使用。 感谢@DipeshParmar,但它并没有解决问题。 您似乎在请求 jsonp(填充的 json),但从服务器返回一个字符串。您能否显示服务器提供的完整输出?您是否在初始化 javascript 或 ajax 调用后收到错误? 使用 jsonp,你应该看到的是 somefunction("HelloWorldResult":"Hello World"); 。设置CrossDomainScriptAccessEnabled Hello @Jite 服务器方法被调用并给出输出 "HelloWorldResult":"Hello World" 【参考方案1】:

您的 WCF 服务器应配置为启用 jsonpCrossDomainScriptAccessEnabled

这是一个简单的工作示例

服务器:

Task.Run(() =>

    var uri = new Uri("http://0.0.0.0/test");
    var type = typeof(TestService);
    WebServiceHost host = new WebServiceHost(type, uri);
    WebHttpBinding binding = new WebHttpBinding();
    binding.CrossDomainScriptAccessEnabled = true;
    host.AddServiceEndpoint(type, binding, uri);


    host.Open();

);

[ServiceContract]
public class TestService

    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    public string Hello()
    
        return "Hello World";
    

这是javascript代码

<html>
<body>
<script src='http://code.jquery.com/jquery-1.10.2.min.js'></script>
<script>
    $(document).ready(function () 
    $.ajax(
        type: 'GET',
        async: false,
        contentType: "application/json",
        url: "http://localhost/test/hello",
        dataType: "jsonp",
        success: function (data) 
            alert(data);
        ,
        error: function (data) 
            alert(data);
        
    );
);

</script>
</body>
</html>

现在您可以通过浏览器对其进行测试

http://localhost/test/hello

http://localhost/test/hello?callback=myfunc

【讨论】:

以上是关于WCF 跨域使用 Jsonp 错误未捕获语法错误:意外令牌:的主要内容,如果未能解决你的问题,请参考以下文章

获取未捕获的语法错误:意外的令牌:读取 jsonp 响应时

jQuery JSONP“未捕获的语法错误:意外的令牌:”

JsonP 返回“未捕获的语法错误:意外的令牌:”AngularJS - routingnumbers.info

在跨域请求中捕获 JSONP 错误

JSONP 不适用于 ExtJS 4 - 未捕获的类型错误:无法调用未定义的方法“子字符串”

WCF + JSONP:总是收到“方法不允许”错误消息