微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – WCF服务返回带有匿名对象的JSON

对于我正在构建的简单API,我使用了几种技术.首先,这不是我创建的第一个API,但它是我第一个将WCF,json和匿名对象组合在一起的API.

我为WCF API获得了以下接口:

[ServiceContract]
public interface IAPI
{
    [OperationContract]
    [WebInvoke(Method = "POST",BodyStyle = WebMessageBodyStyle.WrappedRequest,ResponseFormat = Webmessageformat.Json,RequestFormat = Webmessageformat.Json)]
    ServiceResponse Authenticate(string username,string hashedPassword);

    [OperationContract]
    [WebInvoke(Method = "POST",RequestFormat = Webmessageformat.Json)]
    ServiceResponse GetProducts();
}

这一切都非常简单,只有两种我想要的方法.你看到的ServiceResponse类也很简单,但是我想到的问题是:

[DataContract]
public class ServiceResponse
{
    [DataMember]
    public ResponseCode Status { get; set; }

    [DataMember]
    public object Value { get; set; }
}

我创建了这个类,所以我总是可以发送一个Status(Simple int enum)和一个对象,例如一个字符串或一个对象列表.

我使用jQuery创建了一个小脚本来测试我的服务,而Authenticate方法就像它应该的那样工作,但是这个方法返回一个ServiceResponse对象,在Status字段中只有一个0. “值”字段在此处保留为空.

GetProducts方法一个棘手的方法,一个像这样的匿名对象数组:

public ServiceResponse GetProducts()
{
       DataClassesDataContext db = new DataClassesDataContext();
       var results = from p in db.Products
                     where p.UserID == 1
                     select new
                     {
                         ID = p.ID,Name = p.Decryptedname
                     };

        return ServiceResponse.OK(results.ToArray());
}

在这里使用匿名类型对象,因为我不想为我想在API中使用的所有类创建代理类.

当我尝试使用我的简单jQuery脚本编写此代码时,FireBug告诉我我的请求已被中止.我想这是因为错误500或其他什么.当我在我的GetProducts方法中放置一个断点时,它会在Firefox说它被中止并且脚本完全运行之前被点击7次.

这是我用来测试我的WCF服务的jQuery脚本:

$.ajax({
    type: "POST",contentType: "application/json; charset=utf-8",url: "/Handlers/API.svc/GetProducts",data: '{}',dataType: "json",success: function (response) {
        var test = inspect(response,5);
        $("#output").html(test);
    },error: function (message) {
        $("#output").html(inspect(message,5));
    }
});

你在那里看到的inspect方法只是一个小的JS脚本,它向我展示了一个对象的内容.

我尝试了以下方法来推动它:

>使用Product类型的对象替换匿名对象,但这以相同的方式失败
>返回列表< T>而不是阵列,但也没有运气.
>没有任何分配给Value属性的返回,这是有效的
>将属性值更改为动态类型,此操作也失败

如果我可以使用WCF返回某种匿名对象数组,我会喜欢它,因为这可以节省我创建30个代理类.

注意:Product类是LINQ生成的类.我正在使用C#4.0.

解决方法

我可能错了,但我相信WCF相当严格,不允许你按照你想要的方式返回一个对象.如果您知道每次更改定义以反映该数据时数据将成为一个数组(但听起来这在您的情况下不起作用).否则,您可能需要考虑将签名更改为简单字符串,并在返回之前先将数据序列化为JSON.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐