GZip 标头中的幻数不正确.确保您正在传入 GZip 流
本文关键字:GZip 确保 不正确 | 更新日期: 2023-09-27 18:30:30
我正在尝试使用 WebAPI 从 EntityFramework 中检索产品名称及其 ID 作为 NameID 对象。 代码如下。
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)
堆栈跟踪似乎指示从数据库中读取实体框架模型元数据时出现问题。
HistoryRepository.GetLastModel
调用ModelCompressor.Decompress
,它使用 XDocument.Load
从GZipStream
读取某些 XML。此操作失败,并且数据库中的模型元数据很可能已损坏。
您可以尝试重新创建数据库来解决此问题。
有点晚了,已经有一个公认的答案,这将起作用。但是,如果您已经有一个工作数据库并且不想刷新数据库,则可以在 Global.asax 的 application_start 函数中使用 null 调用Database.SetInitializer
。这不会查找包含损坏数据的__migrationhistory
表。
无法为我重新创建数据库,我已经将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'
就我而言,我通过使用UPDATE-DATABASE运行数据库迁移来摆脱此错误。它运行了所有迁移文件,创建了迁移历史记录表以及模型的哈希值。
为了让您了解之前发生的情况:我之前在 Dev 环境中运行了迁移脚本,并从生产环境复制了迁移历史记录数据。每当我运行 Web API 时,EF 都会读取数据库,并查找未与迁移历史记录表中的规范同步的数据库上下文。
在我运行更新数据库后,一切都很顺利。