2012-04-10 96 views
4

WebAPIを使用してEntityFrameworkからNameIDオブジェクトとして製品名とそのIDを取得しようとしています。コードは次のとおりです。GZipヘッダーのマジックナンバーが正しくありません。 GZipストリームを渡していることを確認してください

public class ProductController : ApiController 
{ 
    protected MainDataContext db = new MainDataContext(); 
    // GET /api/values 
    public IQueryable<NameID> Get() 
    { 
     return db.Products.Select(x=>new NameID{ ID=x.ID,Name=x.Name }).AsQueryable(); 
    } 

    // GET /api/values/5 
    public NameID Get(long id) 
    { 
     var result = db.Products.Select(x=>new NameID{ ID=x.ID,Name=x.Name }).SingleOrDefault(x => x.ID == id); 
     if (id == 0 || result == null) 
      throw new HttpResponseException(HttpStatusCode.NotFound); 
     return result; 
    } 

} 
public class NameID { 
    public long ID {get;set;} 
    public string Name {get;set;} 
} 

これは、スタックトレース

The magic number in GZip header is not correct. 
Make sure you are passing in a GZip stream. 

at System.IO.Compression.GZipDecoder.ReadHeader(InputBuffer input) 
at System.IO.Compression.Inflater.Decode() 
at System.IO.Compression.Inflater.Inflate(Byte[] bytes, Int32 offset, Int32 length) 
at System.IO.Compression.DeflateStream.Read(Byte[] array, Int32 offset, Int32 count) 
at System.IO.Compression.GZipStream.Read(Byte[] array, Int32 offset, Int32 count) 
at System.Xml.XmlTextReaderImpl.InitStreamInput(Uri baseUri, String baseUriStr, Stream stream, Byte[] bytes, Int32 byteCount, Encoding encoding) 
at System.Xml.XmlTextReaderImpl..ctor(Stream stream, Byte[] bytes, Int32 byteCount, XmlReaderSettings settings, Uri baseUri, String baseUriStr, XmlParserContext context, Boolean closeInput) 
at System.Xml.XmlReaderSettings.CreateReader(Stream input, Uri baseUri, String baseUriString, XmlParserContext inputContext) 
at System.Xml.XmlReader.Create(Stream input, XmlReaderSettings settings, String baseUri) 
at System.Xml.Linq.XDocument.Load(Stream stream, LoadOptions options) 
at System.Data.Entity.Migrations.Edm.ModelCompressor.Decompress(Byte[] bytes) 
at System.Data.Entity.Migrations.History.HistoryRepository.GetLastModel(String& migrationId) 
at System.Data.Entity.Migrations.History.HistoryRepository.GetLastModel() 
at System.Data.Entity.Internal.InternalContext.QueryForModel() 
at System.Data.Entity.Internal.ModelCompatibilityChecker.CompatibleWithModel(InternalContext internalContext, ModelHashCalculator modelHashCalculator, Boolean throwIfNoMetadata) 
at System.Data.Entity.Internal.InternalContext.CompatibleWithModel(Boolean throwIfNoMetadata) 
at System.Data.Entity.CreateDatabaseIfNotExists`1.InitializeDatabase(TContext context) 
at System.Data.Entity.Internal.InternalContext.<>c__DisplayClass8.<PerformDatabaseInitialization>b__6() 
at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) 
at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() 
at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c) 
at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input) 
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action) 
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() 
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) 
at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() 
at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() 
at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider() 
at System.Linq.Queryable.Select[TSource,TResult](IQueryable`1 source, Expression`1 selector) 
at ProductAPI.Controllers.ProductController.Get() in D:\Demo\ProductAPI\Controllers\ProductController.cs:line 24 
at lambda_method(Closure , Object , Object[]) 
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) 
at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.Execute(HttpControllerContext controllerContext, IDictionary`2 arguments) 
at System.Web.Http.Controllers.ApiControllerActionInvoker.<>c__DisplayClass2.<InvokeActionAsync>b__0() 
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken) 
+2

あなたがして.zipファイルを解凍しようとしていますgzip? – Zaki

+0

私は何も試していません。戻り値はNameIDオブジェクトです。これはEntityFramework pocoを持つ純粋なVannilaプロジェクトです。 HTTP圧縮も設定されていません。 –

+0

IQueryableの停止時にエラーが発生しないようにする場合に役立ちます。さらに説明するようにコードを変更しています。 –

答えて

5

を、次のようなエラーがスローされ、データベースからEntity Frameworkのモデルのメタデータの読み取りに問題があることを示しているようです。

HistoryRepository.GetLastModelXDocument.Loadを使用して読み取るModelCompressor.Decompressは、GZipStreamから一部のXMLを読み取ります。これは失敗し、データベースのモデルメタデータは破損している可能性が最も高いです。

この問題を回避するには、データベースを再作成してみてください。

3

少し遅れており、すでに受け入れられている回答があり、これはうまくいきます。ただし、すでにデータベースが稼働していて、データベースを更新したくない場合は、Global.asaxのapplication_start関数でDatabase.SetInitializerをnullで呼び出すことができます。これは、破損したデータを含む__migrationhistoryテーブルを探しません。

3

私のためにデータベースを再作成する方法はありません。すでにDatabase.SetInitializernullを使用しています。

幸いなことに、私は別のデータベースに最新の__MigrationHistoryテーブルを持っていると私はターゲット・データベースに正しい値を設定するには、このSQLクエリを使用:

INSERT INTO TargetDbName.dbo.__MigrationHistory (MigrationId, Model, ProductVersion) 
SELECT MigrationId, Model, ProductVersion 
FROM SourceDbName.dbo.__MigrationHistory 
WHERE MigrationId = 'YYYYMMDDHHMMSSFFF_LastMigration' 
関連する問題