0

我正在为大学做一个项目,其中一个网站将命令发送到 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;
        }
    }
}
4

1 回答 1

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。

最后,我的解决方案应该让您的代码正常工作并启动 JSONP,但它不是正确的做事方式。它更像是一个丑陋的黑客。您的 GPS 控制器应读取参数调用的 HTTP 请求,'callback'这是 JSONP 调用的公认约定。然后,您应该使用此回调参数的值,而不是在 return 语句中硬编码函数名称。然后你不需要在你的 jQuery 中使用像 'cmdTorre' 这样的特定函数。相反,像这样的匿名函数success:function(response){...}可以正常工作。

希望有帮助。

于 2013-06-11T01:06:18.023 回答