为什么我会收到"GZip标头中的幻数不正确".使用OWIN auth对Azure SQL的错误

Gon*_*ing 5 asp.net-mvc entity-framework connection-string azure owin

Google或SO上的任何内容都与此特定问题无关,因此请问一个新问题.我使用标准的用户安全选项创建了一个全新的Asp.Net MVC Web应用程序.我还在Azure中创建了一个空数据库.

我什么也没做,只是将默认连接字符串更改为:

  <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="data source=mydatabase.database.windows.net;initial catalog=Feedback;persist security info=True;user id=LeaveFeedbackuser;password=mypassword;MultipleActiveResultSets=True;App=EntityFramework"
         providerName="System.Data.SqlClient" />
  </connectionStrings>
Run Code Online (Sandbox Code Playgroud)

和默认的连接工厂:

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v12.0" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
Run Code Online (Sandbox Code Playgroud)

在尝试注册时(我希望它通常创建AspNetUsers和相关的表)我得到以下错误:

GZip标头中的幻数不正确.确保传入GZip流.描述:执行当前Web请求期间发生未处理的异常.请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息.

异常详细信息:System.IO.InvalidDataException:GZip标头中的幻数不正确.确保传入GZip流.

来源错误:

第153行:{第154行:var user = new ApplicationUser {UserName = model.Email,Email = model.Email}; 第155行:var result = await UserManager.CreateAsync(user,model.Password); 第156行:if(result.Succeeded)第157行:{

这与GZip有什么关系以及导致此错误的原因是什么?这已经阻止我让OWIN使用我的Azure数据库好几天了.

Mr.*_*ble 9

我遇到了类似的问题.

实体框架__MigrationHistory Model列包含GZip数据.如果此列中的数据已损坏,那么您的应用将无法解压缩数据,您将收到错误消息.

在我的情况下,通过尝试手动插入此功能发生了损坏.

我的解决方案:删除损坏的__MigrationHistory行和相关的数据库更改,并允许应用程序正确迁移数据库.


ris*_*ism 0

这就是我的“理论”。我认为 Sql Azure Db 设置不正确或连接字符串错误。

我们知道,当 AspIdentity 尝试在登录时访问数据库并发现表未设置时,它将尝试创建它们。

我认为 AspIdentity 代码中存在一个故障/错误,在这种情况下,它会吞掉由错误连接字符串生成的异常,从而导致设置失败,并继续尝试向客户端提供身份验证票证。

如果我们查看Microsoft.Owin.Security.DataHandler.Serializer.TicketSerializer的代码,我们会发现一些 GZip 操作:

 public virtual byte[] Serialize(AuthenticationTicket model)
        {
            using (var memory = new MemoryStream())
            {
                using (var compression = new GZipStream(memory, CompressionLevel.Optimal))
                {
                    using (var writer = new BinaryWriter(compression))
                    {
                        Write(writer, model);
                    }
                }
                return memory.ToArray();
            }
        }
Run Code Online (Sandbox Code Playgroud)

所以基本上我认为 AspIdentity 在连接上失败,这个错误被吞没,Owin 管道继续处理请求,但当它遇到TicketSerializer 可能是空值或其他一些虚假值时,Gzip 会尝试压缩,然后 Boom!

随后出现奇怪的 YSOD 输出。

GZip 标头中的幻数不正确。确保您传递的是 GZip 流。描述:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其在代码中的来源的更多信息。

AspIdentity 未正确短路此特定事件的 OWIN 请求处理。

可能完全是废话,但无论如何我都会把它扔掉。