如何从ASP.NET Web服务生成JSONP以进行跨域调用?
|
我写了一个返回JSON的webservice,我试图使用jQuery调用它: $.ajax({
contentType: "application/json; charset=utf-8",url: "http://examplewebsite.com/service.asmx/GetData",data: { projectID: 1 },dataType: "jsonp",success: function () {alert("success");}
});
然而,尽管使用Fiddler查看HTTP流量时,尽管webservice调用成功,代码也不会调用成功函数。我认为这是因为我的Web服务返回原始的JSON而不是JSONP。 如何将JSONP作为来自标准.NET Webservice方法的响应,如下所示: [WebMethod(),ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
public Project GetData(int projectID)
{
Project p = new Project();
p.Name = "foobar";
return p;
}
谢谢。 解决方法好的,我终于知道了。当我发现很难在网上找到一个完整的工作解决方案时,我决定在这里记录我的工作解决方案。JSONP响应只是包含在函数调用中的标准JSON字符串。 ASP.NET似乎没有提供任何方式直接返回这种格式的响应,但是这样做很简单。你尽管如此,不得不重写JSON编码的默认方法。 以下是JSONP的一个例子。 functionName({name:’value’;}); 知道这一点: 这是通过使用我们自己的代码将JSONP写入输出流(Response)来完全覆盖Web服务功能的响应。这其实是很简单的,我在下面列举了一个例子。 您可以使用内置的DataContractJsonSerializer(来自ASP.NET 3.5中的System.Runtime.Serialization.Json命名空间)或NewtonSoft JSON序列化程序,这两个示例如下所示。我喜欢使用NewtonSoft JSON(从nuget安装),而不是内置的JSON序列化程序,因为我发现它可以让您更多的控制,并且还可以输出格式好的可读JSON的调试。纸上也快得多! [WebMethod()]
[ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
public void GetData(int projectID,string callback)
{
List<Video> videos = null;
// <code here to populate list on line above>
// Method 1: use built-in serializer:
StringBuilder sb = new StringBuilder();
JavaScriptSerializer js = new JavaScriptSerializer();
sb.Append(callback + "(");
sb.Append(js.Serialize(videos));
sb.Append(");");
// Method 2: NewtonSoft JSON serializer (delete as applicable)
// StringBuilder sb = new StringBuilder();
// sb.Append(callback + "(");
// sb.Append(JsonConvert.SerializeObject(videos,Formatting.Indented)); // indentation is just for ease of reading while testing
// sb.Append(");");
Context.Response.Clear();
Context.Response.ContentType = "application/json";
Context.Response.Write(sb.ToString());
Context.Response.End();
}
然后可以使用以下JQuery代码调用此方法: $.ajax({
crossDomain: true,contentType: "application/json; charset=utf-8",// example of parameter being passed
dataType: "jsonp",success: onDataReceived
});
function onDataReceived(data)
{
alert("Data received");
// Do your client side work here.
// 'data' is an object containing the data sent from the web service
// Put a JS breakpoint on this line to explore the data object
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET MVC验证使用qTip jQuery插件
- asp.net – Windows 7 SP1 IIS错误与“无效的应用程序路径”
- asp.net – IIS URL重写:强制规范主机名和HTTP到HTTPS重定
- asp.net-mvc – ASP.Net MVC 3:反向授权属性
- asp.net – 如何在Entity框架中添加表?
- asp.net-mvc – 无法加载文件或程序集Oracle.DataAccess
- asp.net-mvc – ASP.NET MVC 6中的文件IO Close()方法错误
- azure – 当用户存储在外部身份提供程序服务中时与用户的关
- asp.net-mvc – 如何添加到Azure会话Cookie HttpOnly和Secu
- asp.net – Application_End应该在自动App Pool Recycle上启
- asp.net – Nlog不创建相对于网站项目的文件
- asp.net – 如何禁用提交行为的asp:ImageButton
- 如何测试ASP.NET会员密码是否符合配置的复杂性要
- asp.net-mvc – MVC控制器正在被调用两次
- asp.net-mvc – ASP.Net MVC 5带范围的Google身份
- asp.net-mvc – 如何构建一个企业MVC应用程序,业
- asp.net-mvc – 使用Castle Windsor在ASP.NET MV
- asp.net-mvc – 路由是在我的区域中找到控制器,但
- ASP.NET DropDownList不保留所选项目在回发
- 如何衡量我在ASP.NET中的能力水平或技能?
