如何从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 – 此行已经属于另一个表
- asp.net-mvc – 如何绘制密码字段就像我们绘制Ember.TextFi
- asp.net – 在.NET .NET页面生命周期中,DataBinding事件何时
- asp.net – 存储字符串数组在appSettings?
- asp.net-mvc – 在不更新的其他.config文件上的AppSettings
- asp.net-mvc – ASP.NET MVC自定义授权
- asp.net-mvc – MVC3默认路由到区域不搜索区域内的视图
- asp.net-mvc – 当使用AutoMapper / AutoMapViewResult时如
- 为不同的ASP.NET MVC 3区域提供不同的登录页面
- asp.net – 跨线程使用HTTPContext
- asp.net-mvc – 域vs DTO vs ViewModel – 如何和
- asp.net – Page.IsValid如何工作?
- asp.net-mvc-3 – Ajax.BeginForm返回整页
- asp.net – PreRenderComplete和SaveState之间的
- asp.net-mvc – 在ASP.NET MVC应用程序中记录用户
- asp.net – 如何优化T-SQL查询
- asp-classic – ASP经典CDO电子邮件消息在textbo
- asp.net – Facebook和G的自定义LINK共享URL
- asp.net-mvc – mvc 3 session和authorizeAttrib
- 即使模型无效,ASP.NET MVC“Ajax.BeginForm”也执