加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

如何从ASP.NET Web服务生成JSONP以进行跨域调用?

发布时间:2020-12-16 00:48:00 所属栏目:asp.Net 来源:网络整理
导读:我写了一个返回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("su
我写了一个返回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’;});

知道这一点:
{name:’value’;}只是JSON序列化程序给你的标准JSON,所以我们需要做的就是在函数调用包装器上。不幸的是,这样做意味着当您从Web服务功能返回一个对象时,我们必须“不需要”(或绕过)现有的JSON编码,该编码由框架透明地处理。

这是通过使用我们自己的代码将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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读