我正在为大学做一个项目,其中一个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;
}
}
}
答案 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
});
我再次建议你查看我为语法问题编写的代码,因为我只是在这里输入了它,但它应该给你一个想法。
问题是:
最后,我的解决方案应该让您的代码正常工作并启动JSONP,但这不是正确的做事方式。它更像是一个丑陋的黑客。您的GPS控制器应该读取名为'callback'
的参数的HTTP请求,这是JSONP呼叫的公认约定。然后,您应该使用此回调参数的值,而不是在return语句中对函数名进行硬编码。然后你不需要在你的jQuery中使用像'cmdTorre'这样的特定函数。相反,像success:function(response){...}
这样的匿名函数可以正常工作。
希望有所帮助。