8

流暢なAPIを使用してEntityFrameworkコードを最初に作成しました。

私はWebAPIコントローラーを持っています:

public class NewsController : ApiController
{
    private TrafficTheoryContext db = new TrafficTheoryContext();

    // GET api/News
    public IEnumerable<News> GetNews()
    {
        //return new List<News> {
       //  new News{ Title = "Featuring Azure ACS Authentication", Subtile="Hello "}};
        return db.News.AsEnumerable();
    }
} 

getリクエストを行うと、エラーが発生します。

このXMLファイルには、スタイル情報が関連付けられていないようです。ドキュメントツリーを以下に示します。

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace/>
<InnerException>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Type 'System.Data.Entity.DynamicProxies.News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C' with data contract name 'News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
</ExceptionMessage>
<ExceptionType>
System.Runtime.Serialization.SerializationException
</ExceptionType>
<StackTrace>
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle) at WriteArrayOfNewsToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract ) at System.Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) at System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c__DisplayClass7.<WriteToStreamAsync>b__6() at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)
</StackTrace>
</InnerException>
</Error>

ニュースのリストを返すだけで問題なく動作します。留め金になんらかの名前が付いているのに気づきましたが、それが何であるかわかりません。

webapiを機能させるにはどうすればよいですか?

4

3 に答える 3

4

エンティティ用に生成された動的プロキシが原因で、この例外が発生すると思います。例外メッセージを見ると、実際にはニュースタイプではなく、System.Data.Entity.DynamicProxies.News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51Cタイプがシリアル化されています。このタイプは、遅延読み込みをサポートするためにEntityFrameworkによって作成されました。動的プロキシの詳細については、http://msdn.microsoft.com/en-US/data/jj592886を参照してください。私はWebAPIをよく知りませんが、例外は実際に何をする必要があるかを示しています。

タイプ'System.Data.Entity.DynamicProxies.News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51C'、データコントラクト名'News_786DE29B12691F869E9C9DF523A808EABE06546C3FCE3354F77875B83B9EB51 DataContractResolverを使用するか、既知のタイプのリストに静的に不明なタイプを追加することを検討してください。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知のタイプのリストに追加します。

タイプは自動的に作成されるため、属性を設定することはできません。したがって、「DataContractResolverの使用を検討する」と「DataContractSerializerに渡される既知のタイプのリストにそれらを追加する」部分に焦点を当てます。

ところで、どのバージョンのEFを使用していますか?この問題は以前に見たと思いますが、EF5RTMで修正されました。

于 2012-09-28T21:32:40.203 に答える
4

Mcv5プロジェクトでも、プロキシの作成を無効にすると、すべてが魅力的なように機能するという同じ問題に直面していました。それがお役に立てば幸いです。

DbContext.Configuration.ProxyCreationEnabled = false;
于 2014-11-13T09:27:32.843 に答える
0

.AsEnumerableの代わりに、.ToList()を使用します。また、データコンテキストをどのように作成および破棄しているかについても興味があります。

于 2012-09-28T21:40:48.300 に答える