Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Магическое число в заголовке GZip неверно. Убедитесь, что вы передаете поток GZip

Автор вопроса: Anuj PandeyОтветов: 4

Я пытаюсь получить имя продукта и его идентификаторы как объект NameID из EntityFramework, используя WebAPI. код для которого выглядит следующим образом.

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)
  • вы пытаетесь разархивировать файл .zip с помощью gzip? Zaki 10.04.2012
  • Я ничего не пытаюсь. за исключением возврата объекта NameID. и это чистый проект Vannila с EntityFramework poco. Также не установлено сжатие http. Anuj Pandey 10.04.2012
  • В случае, если это поможет, это не приведет к ошибке при возврате IQueryable. Я изменяю код для дальнейшего объяснения. Anuj Pandey 10.04.2012
  • Я не уверен, но кажется, что EF пытается получить метаданные модели из базы данных, и эти метаданные повреждены (не в формате GZip, как ожидалось). Вы пробовали воссоздать базу данных? Martin Liversage 10.04.2012
  • Я просто вижу, что метаданные повреждены. спасибо @MartinLiversage, что помогли. Anuj Pandey 10.04.2012
  • Пожалуйста, удалите вопрос или опубликуйте ответ, если проблема решена. Aliostad 10.04.2012

entity-framework

Ответы

Ответ 1 · рейтинг 8 · Martin Liversage

Трассировка стека указывает на проблему чтения метаданных модели Entity Framework из базы данных.

HistoryRepository.GetLastModel вызывает ModelCompressor.Decompress, который использует XDocument.Load для чтения некоторого XML из GZipStream. Это не удается, и метаданные модели в базе данных, скорее всего, повреждены.

Вы можете попытаться воссоздать базу данных, чтобы обойти эту проблему.

Ответ 2 · рейтинг 6 · etrast81

Немного поздно, и уже есть принятый ответ, который сработает. Но если у вас уже есть рабочая база данных и вы не хотите ее обновлять, вы можете вызвать Database.SetInitializer с нулевым значением в функции application_start Global.asax. Это не будет искать таблицу __migrationhistory, содержащую поврежденные данные.

Ответ 3 · рейтинг 4 · Dude Pascalou

У меня нет возможности воссоздать базу данных, и я уже использую Database.SetInitializer с null.

К счастью, у меня есть актуальная таблица __MigrationHistory в другой базе данных, и я использовал этот запрос Sql, чтобы установить правильное значение в целевой базе данных:

INSERT INTO TargetDbName.dbo.__MigrationHistory (MigrationId, Model, ProductVersion)
SELECT MigrationId, Model, ProductVersion
FROM SourceDbName.dbo.__MigrationHistory
WHERE MigrationId = 'YYYYMMDDHHMMSSFFF_LastMigration'

Ответ 4 · Noel

В моем случае я избавился от этой ошибки, запустив миграцию базы данных с помощью UPDATE-DATABASE. Он запустил все файлы миграции, создал таблицу истории миграции, а также хеш-значение модели.

Чтобы дать вам представление о том, что произошло ранее: ранее я запускал сценарий миграции в среде разработки и копировал данные истории миграции из рабочей среды. Всякий раз, когда я запускаю свой веб-API, EF считывает базу данных и находит контекст базы данных, не синхронизированный со спецификациями, которые находятся в таблице истории миграции.

После того, как я запустил UPDATE-DATABASE, все прошло хорошо.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы