JSONP没有获得价值结果

时间:2013-06-11 00:46:38

标签: c# json jsonp

我正在为大学做一个项目,其中一个WebSite将命令发送到Windows窗体应用程序。该应用程序负责访问串行端口以及发送和接收命令。

网站和Windows窗体应用程序之间的通信,我使用了Web Api,但是在发布之后,试镜记住了C#WebSite中的localhost。 Net自己的网站,而不是我的Windows窗体应用程序。

我改变了对Web Api的调用直接使用Ajax而不是控制器。 在示例中,我发现我看到我使用JSONP,但我无法读取结果并在我的网站上使用它。

Chrome看到的主叫代码和回复位于

之下
function cmdLocal() {
    $.ajax({
        type: "GET",
        dataType: "jsonp",
        url: "http://local host:8089/api/gps/",
        jsonpCallback: "cmdTorre",
        jsonp: "cmdTorre"
    });             
}

function cmdTorre(data) {
    alert(data);
}

响应标题

Content-Length:10
Content-Type:application/json; charset=utf-8
Date:Tue, 10 Jun 2014 11:18:30 GMT
Server:Microsoft-HTTPAPI/2.0

响应

No Properties

Windows窗体APIController

namespace TCCWindows.Lib
{
    public class GPSController : ApiController
    {
        [HttpGet]
        public string Posicao()
        {
            var coordenada = TCCWindows.FormPrincipal.PegarCoordenadas();
            return coordenada.Latitude + "|" + coordenada.Longitude + "|" + coordenada.Altitude;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

首先,你的ajax调用过于复杂,请尝试将其替换为:

function cmdLocal() {
    $.ajax({
        type: "GET",
        dataType: "jsonp",
        url: "http://local host:8089/api/gps/",
        success: cmdTorre,
        error: function(err){
           alert("You have a error"+err);
        }
    });             
}

function cmdTorre(data) {
    alert(data);
}

请仔细验证新代码。我只是在这里打字,所以可能有错误。如果此时运行,您可能应该看到错误消息。那是因为你的GPSController似乎没有返回有效的JSONP(或JSON)。请阅读JSONP以获得更多说明,但是,我认为如果您修改return语句使其看起来如下,它应该可以工作。假设您的控制器实际上已被调用,并且您的网络正在运行:

 return "cmdTorre({\"lat\":"+coordenada.Latitude+" , \"lon\":"+coordenada.Longitude+" });" 

基本上,在控制台上打印时,返回字符串应如下所示:

function cmdTorre({
    "lat": 23.34,
    "lon":34.23,
    "alt":50
});

我再次建议你查看我为语法问题编写的代码,因为我只是在这里输入了它,但它应该给你一个想法。

问题是:

  1. 您生成的返回字符串不是JSON格式
  2. 它也没有包含在函数调用中,也使它成为无效的JSONP。
  3. 最后,我的解决方案应该让您的代码正常工作并启动JSONP,但这不是正确的做事方式。它更像是一个丑陋的黑客。您的GPS控制器应该读取名为'callback'的参数的HTTP请求,这是JSONP呼叫的公认约定。然后,您应该使用此回调参数的值,而不是在return语句中对函数名进行硬编码。然后你不需要在你的jQuery中使用像'cmdTorre'这样的特定函数。相反,像success:function(response){...}这样的匿名函数可以正常工作。

    希望有所帮助。