我正在尝试为jQuery输出正确包装的JSONP值。
我正在寻找的输出是:
jsoncallback({"Status": "OK"})
但是它正在输出:
"jsoncallback({"Status": "OK"})"
显然这不是正确的JSONP格式,因为jQuery请求无法处理响应。
我在C#中的操作合同是:
[OperationContract]
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "returndata?s={s}")]
Stream EchoWithGet(string s);
public string EchoWithGet(string s)
{
string json = @"jsoncallback({'Status':'OK'})";
Console.WriteLine("Call Made: " + s);
return json;
}
我已尝试使用JSON.NET
以及System.Web.Script
命名空间来使用JavaScriptSerializer
。
但是没有什么对我有用我真正想做的就是摆脱两个双引号。
答案 0 :(得分:11)
如果你使用jQuery提交ajax请求并要求dataType: "jsonp"
,jQuery将在请求中传递回调函数的名称(例如,/returndata?s=hello&callback=jquery123456789
),因此返回一个常量“jsonCallback “在那种情况下不会起作用。
此外,在您的问题中,您的操作合同定义返回Stream
,而操作本身则返回string
- 那里出现了问题。
您需要做什么:您有两种选择。第一个是让WCF为您处理JSONP填充。您的操作需要返回一个属性为“Status”的数据类型,然后返回它。您还需要在端点使用的WebHttpBinding上启用CrossDomainScriptAccessEnabled
属性。您的操作看起来类似于以下代码:
public class MyType
{
public string Status { get; set; }
}
[ServiceContract]
public class Service
{
[WebGet(UriTemplate = "returndata?s={s}")]
public MyType ReturnData(string s)
{
return new MyType { Status = "OK" };
}
}
如果您想自己创建JSONP代码,第二个选项是在回调函数名称的URI中使用其他参数,然后在创建响应时使用它。您还需要将其作为Stream
返回,这样您就不会将响应作为字符串获取(这可能就是您现在所拥有的)。这看起来像这样:
[ServiceContract]
public class Service
{
[WebGet(UriTemplate = "ReturnData?s={s}&callback={callbackFunctionName}")]
public Stream EchoWithGet(string s, string callbackFunctionName)
{
string jsCode = callbackFunctionName + "({\"Status\":\"OK\"});";
WebOperationContext.Current.OutgoingResponse.ContentType = "application/javascript";
return new MemoryStream(Encoding.UTF8.GetBytes(jsCode));
}
}
此jQuery代码可用于访问此服务:
function StackOverflow_11090835_Test() {
var url = "/StackOverflow_11090835.svc/ReturnData";
var data = { s: "Hello world" };
$.ajax({
type: 'GET',
url: url,
data: data,
dataType: "jsonp",
success: function (result) {
$("#result").text(result.Status);
}
});
}
答案 1 :(得分:1)
您需要评估WCF调用的输出。请参阅此fiddle。
您正在从WCF调用中获取字符串。你基本上需要编译它然后执行它。
以下是小提琴的代码:
function jsonCallback(obj){
alert(obj.Status);
}
$(document).ready(function(){
var js = "jsonCallback({'Status':'OK'})";
eval(js);
});
js
变量是WCF调用的输出。只要我eval
它,它就会编译并执行。