以正确的格式返回 JSONP WCF

Posted

技术标签:

【中文标题】以正确的格式返回 JSONP WCF【英文标题】:Return JSONP in proper format WCF 【发布时间】:2012-06-20 21:27:46 【问题描述】:

我正在尝试输出正确包装的 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.NETSystem.Web.Script 命名空间来使用javascriptSerializer

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

【问题讨论】:

wpf 和这个有什么关系? 我正在使用 WPF 环境,所以我想迎合这一点。通常我最终会得到与 ASP 相关的答案,但它无济于事 【参考方案1】:

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

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

你需要做的:你有两个选择。第一个是让 WCF 为您处理 JSONP 填充。您的操作将需要返回具有属性“状态”的数据类型,然后将其返回。您还需要在端点使用的 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 ***_11090835_Test() 
        var url = "/***_11090835.svc/ReturnData";
        var data =  s: "Hello world" ;
        $.ajax(
            type: 'GET',
            url: url,
            data: data,
            dataType: "jsonp",
            success: function (result) 
                $("#result").text(result.Status);
            
        );
    

【讨论】:

谢谢你,这可能是我面临的问题,对 Stream DataType 错误感到抱歉,这实际上是我在玩代码时的一个错误。今晚我会试一试,看看会发生什么。再次感谢 效果很好!非常感谢,经过 10 个小时的研究,我终于搞定了。 我不明白第一个选项。 WCF 如何为您处理 JSONP 填充?为什么绑定需要 CrossDomainScriptAccessEnabled 而选项 2 不需要? 在第一个选项中,一旦启用CrossDomainScriptAccessEnabled,WCF格式化程序将查看请求是否有callback=<name>查询参数;如果是这样,那么它会将响应包装在 <name>(); 对中。【参考方案2】:

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

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

这是小提琴的代码:

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


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

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

【讨论】:

您好,感谢您的提示,但我不相信这能回答我的问题,因为 jQuery 甚至没有查看 "jsoncallback("Status": "OK")"

以上是关于以正确的格式返回 JSONP WCF的主要内容,如果未能解决你的问题,请参考以下文章

WCF技术我们应该如何以正确的方式去学习掌握

WCF技术我们应该如何以正确的方式去学习掌握

jQuery JSONP 使用的 CrossDomain WCF 返回 undefined

修改响应标头时,WCF Web 服务未返回正确的状态代码

通过 SSL 使用 JSONP 的 WCF 服务

perl:正确的“内容类型”格式以返回“图像数据 uri”