以正确的格式返回 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.NET
和System.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的主要内容,如果未能解决你的问题,请参考以下文章