我正在为一个有资金驱动的慈善机构做一些工作。每当有人做出承诺时,他们的承诺金额都会记录到SQL Server。他们希望将承诺总额发布在其他几个网站上,所以我想,“这是一个了解网络服务的好时机!”我假设我可以设置一个Web服务,将服务总额作为字符串返回,然后在调用Web服务的外部站点上转储一些jquery代码。
大约九个小时后,我仍然试图弄清楚这些东西。听起来JSONP是执行跨域请求的唯一方法,但即使在查看了一堆教程之后,我也不确定如何让我的.NET页面返回正确的值,现在我想知道是否存在这是完全做到这一点的更好方法。任何人都可以提供完全简化的代码示例吗?
TL; DR:我需要使用来自其他网络服务器的jquery或javascript将一个值返回到一堆页面。
答案 0 :(得分:0)
JSONP是要走的路。底线是您提供一个函数名称用作查询字符串中的回调,将返回的数据序列化为JSON,然后将序列化数据(字符串)包装在函数调用中。 jQuery将在脚本标记内接收到它,以便它将使用JSON数据调用回调函数。
这里有一些代码改编自我的一个ASP.NET MVC项目。给定一个序列化对象和回调参数,它将返回一个可以作为内容发回的字符串。在我的课程中,它实际上返回了一个ContentResult,但我已将其更改为返回一个简单的字符串。
public class JsonPSerializer
{
private string Callback { get; set; }
public JsonPSerializer(string callback)
{
this.Callback = callback;
}
private static string GetJson<T>(T obj)
{
using (MemoryStream stream = new MemoryStream())
{
var serializer = new DataContractJsonSerializer(typeof(T));
serializer.WriteObject(stream, obj);
return Encoding.UTF8.GetString(stream.GetBuffer().TakeWhile( b => b != '\0')).ToArray());
}
}
public string Serialize<T>(List<T> list) where T : IModel
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat("{0}([", Callback);
foreach (var obj in list)
{
builder.Append(GetJson(obj));
builder.Append(",");
}
return builder.ToString().TrimEnd(',') + "])";
}
public string Serialize<T>(T obj) where T : IModel
{
string content = GetJson(obj);
return Callback + "(" + content + ")";
}
}
答案 1 :(得分:0)
这是您的“完全简化的代码示例”:
您的WebMethod(将其放在example.aspx代码后面的文件中):
[WebMethod(CacheDuration = 0, EnableSession = true)]
public static YourResultType YourMethodName(string param1,int param2)
{
YourResultType result=new YourResultType();
result.x1=true;
result.x2="The Response can be in any type";
return result;
}
您的结果类型:
public class YourResultType
{
public YourResultType(){}
public bool x1;
public string x2;
}
JavaScript代码(基于jQuery):
$.ajax({
type: "POST", cache: false,
url: "example.aspx/YourMethodName",
data: "{'randomparam':'" + ((new Date()).getTime()) +
//randomparam is for preventing cache
"','param1':'param1Value','param2':'param2Value'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
if (msg.hasOwnProperty("d")) msg = msg.d;
//And Here, The msg parameter,
//contains the result of the WebMethod
//and you can use that like this:
alert(msg.x1);
alert(msg.x2);
}
});