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 が取得されます。

2 番目の質問は、上記のコードの匿名型を 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 に答える