【问题标题】:Return JSONP in proper format WCF以正确的格式返回 JSONP 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 相关的答案,但它无济于事

标签: c# wpf wcf web-services jsonp


【解决方案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 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);
            }
        });
    }

【讨论】:

  • 谢谢你,这可能是我面临的问题,对 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"})"
猜你喜欢
  • 2014-12-19
  • 2012-04-09
  • 1970-01-01
  • 2012-06-30
  • 2014-06-27
  • 2014-05-16
  • 2017-11-28
  • 2015-07-20
  • 2014-04-19
相关资源
最近更新 更多