2

私は完全に機能する MVC4 Web サイトを持っていますが、今日は Web API を追加しようとしていますが、成功していません。

<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.Infrastructure.DbQuery`1[[LeasingWeb.Models.Car, LeasingWeb, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' with data contract name 'ArrayOfCar:http://schemas.datacontract.org/2004/07/LeasingWeb.Models' 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 WriteCarDBToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , ClassDataContract ) at System.Runtime.Serialization.ClassDataContract.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>

私のオブジェクトは次のとおりです。

public class Image
{
    public int ID { get; set; }

    [Required(ErrorMessage="Please select a car")]
    [ForeignKey("Car")]
    public int CarID { get; set; }

    [DisplayName("Picture")]
    [Required]
    [FileExtensions(ErrorMessage = "Please specify a valid image file (.jpg, .jpeg, .gif or .png)", Extensions = ("jpg,png,jpeg"))]
    public string Name { get; set; }


    public virtual Car Car { get; set; }
}

public class Car
{
    public int ID { get; set; }

    [Required]
    [DisplayName("Car Model")]
    public string Name { get; set; }

    [Required]
    public string Company { get; set; }

    [Required]
    [DisplayName("Car Type")]
    [ForeignKey("CarType")]
    public int CarTypeID { get; set; }

    [Required]
    [Range(1,5)]
    [DisplayName("Number Of Doors")]
    public float NumDoors { get; set; }

    [Required]
    [Range(0, Int32.MaxValue)]
    public float Acceleration { get; set; }

    public virtual CarType CarType { get; set; }
}

public class CarType
{
    [Key]
    public int ID { get; set; }

    [Required]
    [DataType(DataType.Text)]
    public string Type { get; set; }
}

そして、それらの両方を保持するオブジェクト:

public class CarDB
{
    public IQueryable<Car> Cars { get; set; }
    public IEnumerable<Image> Images { get; set; }
}

API コントローラー:

public CarDB Get(int ID = -1)
{
    CarDB car = new CarDB();
    if (ID == -1)
    {
        car = new CarDB { Cars = db.Cars.Include(c => c.CarType), Images = db.Images };
    }
    else
    {
        car = new CarDB { Cars = db.Cars.Where(c => c.ID == ID).Include(c => c.CarType), Images = db.Images.Where(c => c.CarID == ID) };
    }
    return car;
}

助けてくれる人に感謝します。

4

2 に答える 2

4

ここでの問題は、CarDBオブジェクトのCarsメンバーです。DataContractSerializerは、IEnumerableやIListなどの特殊なケースのコレクションインターフェイスですが、IQueryableなどの特殊なケースから派生したインターフェイスではありません。これらのインターフェースでは、型がオブジェクトであるかのように扱われ、実装は既知の型として宣言する必要があります。

IQueryable<Car>メンバーをに変更して、これを修正してみることができますIEnumerable<Car>

于 2013-01-24T15:08:52.167 に答える
0

遅延読み込みで約 40 個の外部キーを持つ 30 個のテーブルを使用するレガシー コードでこの問題が発生しました。すべてのデータベース クラスに注釈を追加するよりも、返されるフィールドを含む ViewModel を作成する方が簡単であることがわかりました。返されるデータが複雑な場合は、automapper を使用することをお勧めします。

于 2014-11-11T09:10:19.227 に答える