以适当的格式返回JSONP WCF
我正在尝试为jQuery输出正确包装的JSONP值以供使用。
我正在寻找的输出是:
jsoncallback({"Status": "OK"})
但它的输出是:
"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
。
但是没有什么对我有用,我真正想做的就是摆脱两个双引号。
如果您使用jQuery提交ajax请求并询问dataType: "jsonp"
,jQuery将在请求中传递回调函数的名称(例如, /returndata?s=hello&callback=jquery123456789
),因此返回一个常量“jsonCallback” “在那种情况下不会起作用。
另外,在你的问题中你有操作合同定义返回Stream
,而在操作本身你返回string
– 那里有些错误。
你需要做什么:你有两个选择。 第一个是让WCF为您处理JSONP填充。 您的操作需要返回一个属性为“Status”的数据类型,然后返回它。 您还需要在端点使用的CrossDomainScriptAccessEnabled
上启用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); } }); }
您需要评估WCF调用的输出。 看到这个小提琴 。
您正在从WCF调用中获取一个字符串。 您基本上需要编译它然后执行它。
这是小提琴的代码:
function jsonCallback(obj){ alert(obj.Status); } $(document).ready(function(){ var js = "jsonCallback({'Status':'OK'})"; eval(js); });
js
变量是WCF调用的输出。 一旦我eval
它,它将编译并执行。
- 如何将多个方法(带参数)作为参数传递?
- 创建一个wcf服务后,如何判断wsdl中的restful或soap?
- WCF – 在nettcpbinding中禁用安全性(c#)
- VS2010将System.Xml.XmlElement与System.Xml.Linq.XElement混淆?
- WCF服务方法在WCF测试客户端中不可用,因为它使用类型
- System.Runtime.Serialization.InvalidDataContractException:没有属性的set方法
- 使用WCF进行双向通信
- 有没有办法在没有IIS的情况下使用WCF自定义友好URL?
- WCF 4.0 – 使用REST服务模板返回JSON WebFaultException