1

我有一个 Web API,我只是想以 XML 格式将一些数据返回给调用客户端。

我不断收到以下错误:

<ExceptionMessage>
Type '<>f__AnonymousType7`9[System.String,System.String,System.String,System.String,System.String,System.String,System.String,System.Nullable`1[System.Int32],System.String]' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute. See the Microsoft .NET Framework documentation for other supported types.
</ExceptionMessage>

这是控制器代码:

public class TribuneShowsController : ApiController
    {
        private readonly TVDataEntities db;

        public TribuneShowsController()
        {
            db = new TVDataEntities();
            db.Configuration.ProxyCreationEnabled = false;
        }

        public IEnumerable GetTribuneShows(string title = null,
                                           string genre = null,
                                           string showTypeDescription = null,
                                           string directorName = null,
                                           string releaseYear = null)
        {
            var query = from shows in db.TRIB_Shows
                        from showTypes in
                            db.TRIB_LKP_ShowTypes.Where(v => v.ShowTypeCode == shows.ShowTypeCode).DefaultIfEmpty()
                        select new
                            {
                                dataSource = "Tribune",
                                shows.Title,
                                EpisodeId = "",
                                EpisodeTitle = "",
                                Genre = shows.Category,
                                showTypes.ShowTypeDescription,
                                shows.DirectorName,
                                shows.ReleaseYear,
                                SeasonEpisode = ""
                            };

            if (title != null)
            {
                query = query.Where(s => s.Title.Contains(title));
            }

            if (genre != null)
            {
                query = query.Where(s => s.Genre.Contains(genre));
            }

            if (showTypeDescription != null)
            {
                query = query.Where(s => s.ShowTypeDescription.Contains(showTypeDescription));
            }

            if (directorName != null)
            {
                query = query.Where(s => s.DirectorName.Contains(directorName));
            }

            if (releaseYear != null)
            {
                query = query.Where(s => s.ReleaseYear.ToString().Contains(releaseYear));
            }

            return query.ToList();
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }

我的第一个问题是,如何将返回对象(通过 API)默认为 XML?因此,无论何时有人访问该链接,他们都会得到一个 XML。

第二个问题是,如何将上面代码中的匿名类型作为 XML 返回给客户端?

4

2 回答 2

4

为类型命名,使其不再是匿名的:

[DataContract]
public class Show
{
     public string DataSource {get; set;}
     public string Title {get; set;}
  ... etc.
}

然后

select new Show
    {
        DataSource = "Tribune",
        Title = shows.Title,
        EpisodeId = "",
        EpisodeTitle = "",
        Genre = shows.Category,
        ShowTypeDescription = showTypes.ShowTypeDescription,
        DirectorName = shows.DirectorName,
        ReleaseYear = shows.ReleaseYear,
        SeasonEpisode = ""
    };
于 2013-06-20T17:48:41.267 回答
0

只需创建一个类型并选择该类型的新实例而不是匿名对象。

至于 XML 类型……你不想那样做。ApiController 的美妙之处在于它将序列化为客户端想要的任何类型。如果他们说 Accept: text/xml 他们会得到 xml。如果他们说 Accept: text/json 他们会得到 JSON。

于 2013-06-20T17:48:18.473 回答