以适当的格式返回JSONP WCF

San*_*sal 6 c# wpf wcf jsonp web-services

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

我正在寻找的输出是:

jsoncallback({"Status": "OK"})
Run Code Online (Sandbox Code Playgroud)

但它输出的atm:

"jsoncallback({"Status": "OK"})"
Run Code Online (Sandbox Code Playgroud)

显然这不是正确的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;
    }
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用JSON.NETSystem.Web.Script命名空间使用JavaScriptSerializer.

但是没有什么对我有用,我真正想做的就是摆脱两个双引号.

car*_*ira 11

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

另外,在你的问题中你有操作合同定义返回Stream,而在操作本身你返回string- 那里有些错误.

你需要做什么:你有两个选择.第一个是让WCF为您处理JSONP填充.您的操作需要返回一个属性为"Status"的数据类型,然后返回它.您还需要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" };
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想自己创建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));
    }
}
Run Code Online (Sandbox Code Playgroud)

这个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);
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)