GZip标头中的幻数不正确。 确保传入GZip流

我正在尝试使用WebAPI从EntityFramework中检索产品名称及其ID作为NameID对象。 代码如下。

public class ProductController : ApiController { protected MainDataContext db = new MainDataContext(); // GET /api/values public IQueryable 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.b__6() at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() at System.Data.Entity.Internal.LazyInternalContext.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.b__0() at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken) 

堆栈跟踪似乎表明从数据库中读取Entity Framework模型元数据时出现问题。

HistoryRepository.GetLastModel调用GZipStream ,它使用XDocument.LoadGZipStream读取一些XML。 这会失败,数据库中的模型元数据很可能已损坏。

您可以尝试重新创建数据库以解决此问题。

它有点晚了,已经有一个接受的答案,这将有效。 但是,如果您已经有一个工作数据库并且不想刷新数据库,则可以在Global.asax的application_start函数中调用带有null的Database.SetInitializer 。 这不会查找包含损坏数据的__migrationhistory表。

无法为我重新创建数据库,我已经使用带有null Database.SetInitializer

幸运的是,我在另一个数据库上有一个最新的__MigrationHistory表,我使用这个Sql查询在目标数据库中设置正确的值:

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