2012-04-10 159 views
4

我試圖從Web EntityFramework中使用WebAPI檢索產品名稱及其ID作爲NameID對象。代碼如下。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 2012-04-10 11:08:05

+0

我沒有嘗試任何東西。除了返回NameID對象。這是EntityFramework poco的純Vannila項目。沒有http壓縮設置。 – 2012-04-10 11:10:05

+0

如果它幫助它在IQueryable returing上沒有錯誤。我正在修改代碼以進一步解釋。 – 2012-04-10 11:11:36

回答

5

堆棧跟蹤似乎預示着有從數據庫中讀取實體框架模型元數據的問題。

HistoryRepository.GetLastModel調用ModelCompressor.Decompress使用XDocument.Load讀取從GZipStream讀取一些XML。這會失敗並且數據庫中的模型元數據很可能已損壞。

您可以嘗試重新創建數據庫以解決此問題。

3

它有點晚了,已經有一個公認的答案,這將工作。但是,如果您已經有一個工作數據庫並且不想刷新數據庫,那麼可以在Global.asax的application_start函數中使用null調用Database.SetInitializer。這不會查找包含損壞數據的表__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'