WCF Json数据返回

时间:2011-06-22 11:47:58

标签: c# wcf json

这就是我的问题和要求。

//下面是我的一个类函数列表,即用户,我还有10-15个类函数

  public IEnumerable<Entity.User> User()
   {
        OpenStoredPorcedure("spDB");

        DataSet d = ExecuteDataSet();

        DataTable myDataTable = d.Tables[0];

        var stList = new List<Entity.User>();

        foreach (DataRow dr in myDataTable.Rows)
        {
            Entity.User usr = new Entity.User()
            {

                FirstName = dr["first_name"].ToString() ?? null,
                LastName = dr["last_name"].ToString() ?? null
            };

            stList.Add(usr);
        }

        return stList.AsEnumerable();
}

现在在WCF中,我想要一个像下面一个

的功能
 public IEnumerable fetchData(int id)
{         
   IEnumerable result1 = null;

    switch (id)

    {
        case 1:
            IEnumerable<Entity.User> result = User().AsEnumerable<Entity.User>().ToArray();
            result1 = result;
            break;
        case 2:
            IEnumerable<Entity.Project> result = User().AsEnumerable<Entity.Project>().ToArray();
            result1 = result;
            break;
    }

    return result1;
}

但是我在使用上述方法时遇到此错误

请求错误 服务器遇到处理请求的错误。异常消息是'无法序列化类型的参数'System.Collections.Generic.List`1 [Entity + User]'(对于操作'fetchData',合同'ISyncService'),因为它不是确切的类型'System.Collections。 IEnumerable'在方法签名中,不在已知类型集合中。要序列化参数,请使用

将类型添加到操作的已知类型集合中

现在我希望在WCF中我们调用这个函数并传递id,它将导致该实体类的json列表。

当我使用以下功能

时,我收到了Json数据
public List<Entity.User> fetchData()
{
        return User().ToList();    
}

2 个答案:

答案 0 :(得分:1)

如果您在返回的类型之间有基类和继承,则应在基类datacontract上添加KnownType属性,然后在属性中指定所有派生类型

像这样的东西

[KnownType(typeof(YourDerivedType))]

以下是一些帮助:http://blogs.msdn.com/b/sowmy/archive/2006/06/06/all-about-knowntypes.aspx

如果您返回的是彼此不相关的类型,您应该按照OsQu的建议做一些事情。

答案 1 :(得分:0)

我认为问题在于您需要为IEnumerable提供类型。

如果您知道每个表中的类型,则可以创建通用方法并为其提供正确的类型。

public IEnumerable<T> fetchData<T>(int id)
{         
   IEnumerable<T> result1 = null;

    switch (id)
    {
        case 1:
            IEnumerable<T> result = sync.User() as IEnumerable<T>;
            result1 = result;
            break;
    }

    return result1;
}

然后使用它:

IEnumerable<Entity.User> retVal = fetchData<Entity.User>(1);

有关generics的更多信息:Generics C#