6

我正在尝试输出正确包装的 JSONP 值以供 jQuery 使用。

我正在寻找的输出是:

jsoncallback({"Status": "OK"})

但是它输出的atm:

"jsoncallback({"Status": "OK"})"

显然这不是正确的 JSONP 格式,因为 jQuery 请求无法处理响应。

我在 C# 中的 OperationContract 是:

[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.

但没有什么对我有用,我真正想做的就是去掉两个双引号。

4

2 回答 2

11

如果您使用 jQuery 提交 ajax 请求并请求dataType: "jsonp",则 jQuery 将在请求中传递回调函数的名称(例如,/returndata?s=hello&callback=jquery123456789),因此在这种情况下返回常量“jsonCallback”将不起作用。

此外,在您的问题中,您有操作合同定义返回Stream,而在操作本身上您正在返回string- 那里有问题。

你需要做什么:你有两个选择。第一个是让 WCF 为您处理 JSONP 填充。您的操作需要返回具有属性“状态”的数据类型,然后返回它。您还需要启用CrossDomainScriptAccessEnabled端点使用的 WebHttpBinding 上的属性。您的操作将类似于以下代码:

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 中为回调函数名称附加一个参数,然后在创建响应时使用它。您还需要将其作为 a 返回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);
            }
        });
    }
于 2012-06-19T00:53:26.160 回答
1

您需要评估 WCF 调用的输出。看到这个小提琴

您从 WCF 调用中得到一个字符串。您基本上需要编译它然后执行它。

这是小提琴的代码:

function jsonCallback(obj){
    alert(obj.Status);
}

$(document).ready(function(){
    var js = "jsonCallback({'Status':'OK'})";
    eval(js);
});​

js变量是 WCF 调用的输出。只要我eval它,它将编译和执行。

于 2012-06-18T21:03:41.900 回答