WCF返回JSONP或自定义结果格式

时间:2014-10-23 16:24:58

标签: c# ajax json wcf jsonp

好吧,我有一个WCF服务,它返回一个我需要使用的属性的自定义对象。

[DataContract]
public class CommonJsonResponse {

    [DataMember]
    public object Data { get; set; }
    [DataMember]
    public bool Success { get; set; }
    [DataMember]
    public int StatusCode { get; set; }

    private string errorMessage;
    [DataMember]
    public string ErrorMessage {
        get {
            return errorMessage;
        }
        set {
            errorMessage = value;
            if (!string.IsNullOrEmpty(value)) {
                Success = false;
            }
        }
    }

    public CommonJsonResponse() {
        Success = true;
    }
}

我的所有服务方法都将使用Data属性中的其他所需数据返回此对象。我有这样的方法:

[WebGet(ResponseFormat=WebMessageFormat.Json)]
public CommonJsonResponse DoSomething(int value, string callback) {

    var response = new CommonJsonResponse();        
    response.Data = JsonConvert.SerializeObject(
        GetItemIntoDatabaseByGivenValue(value));

    return response;
}


$.ajax({
    url: serviceUrl + '/DoSomething',
    type: 'GET',
    dataType: 'jsonp',
    contentType: 'application/json; charset=utf-8',
    data: { value: 1 },
    success: function(response) {
        console.log(response);
    },
    error: function(xhr, response, error) {
        console.log(xhr);
        console.log(xhr.responseText);
        if (xhr.responseText) {
            var err = xhr.responseText;
            if (err) {
                error(err);
            } else {
                error({ Message: "Unknown server error." })
            }
        }
    });

好的,一旦我想使用跨域,想法就是返回一个JSONP对象。我知道AJAX在请求字符串中添加了一些参数 - 比如上面的callback参数。我也知道,为了返回一个正确的JSONP对象,我需要做下面的事情:

var properlyResult = callback + "(" + response + ");";

好的,既然我的方法返回CommonJsonResponse,是否有一种覆盖响应的方法会添加到HttpContext?我的意思是,想法是获取CommonJsonResponse对象将被发送并将其包装到上面的字符串中以生成正确的结果然后将此正确的结果放入HttpContext将被发送回浏览器。

谢谢你的帮助! :)

1 个答案:

答案 0 :(得分:0)

问题解决了。

我已使用此link

感谢rich.okelly(第一个答案)提示.NET Framework 4.0+本地解析JSONP

还要感谢crossDomainScriptAccessEnabled上的webHttpBinding属性提示Rachit Patel(第二个答案)。