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

Я пытаюсь получить имя продукта и его идентификаторы как объект 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)

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


Ответы (4)


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

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

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

person Martin Liversage    schedule 10.04.2012

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

person etrast81    schedule 23.10.2013

У меня нет возможности воссоздать базу данных, и я уже использую 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' 
person Dude Pascalou    schedule 08.11.2013
comment
Большое спасибо. Это решение сработало для меня. Я боролся с этим два дня, и сообщение об ошибке было слишком вводящим в заблуждение, но, наконец, Google привел меня к этому решению. Моя база данных Code First была недоступна из Visual Studio, и миграция была невозможна. Я скопировал весь контент для БД, но это не сработало. Однако установка значения null для вышеуказанного свойства в Global.asax.cs сработала для меня. - person Balaji Birajdar; 17.04.2018
comment
У меня похожая проблема, мне нужно добавить 3 миграции, и их нет в другой базе данных. Какие-либо предложения? - person jmckie; 23.07.2019

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

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

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

person Noel    schedule 04.08.2020