【问题标题】:RavenDB client onlinux connecting to windows server using mono httpRavenDB 客户端 onlinux 使用单 http 连接到 Windows 服务器
【发布时间】:2012-12-13 12:03:21
【问题描述】:

我刚刚尝试使用单声道从 linux 连接到我的 RavenDB Windows 实例。我遇到了一个奇怪的错误,这似乎与单声道有关,而不是与乌鸦有关。

这是我的重新创建代码(适用于 Windows):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Raven.Client.Document;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            try
            {
                var store = new DocumentStore()
                                {
                                    ConnectionStringName = "RavenDB",
                                    EnlistInDistributedTransactions = false

                                };
                store.Initialize();

                using (var session = store.OpenSession("system-events"))
                {
                    session.Store(new { Name = "Test" });
                    session.SaveChanges();
                }
                Console.WriteLine("done");
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.ToString());
            }

            Console.ReadKey();


        }
    }
}

和我的单声道版本:

chris@x-ngx4:~/click/beta/Debug$ mono --version
Mono JIT compiler version 2.10.8.1 (Debian 2.10.8.1-1ubuntu2.2)
Copyright (C) 2002-2011 Novell, Inc, Xamarin, Inc and Contributors. www.mono-project.com
        TLS:           __thread
        SIGSEGV:       altstack
        Notifications: epoll
        Architecture:  amd64
        Disabled:      none
        Misc:          softdebug
        LLVM:          supported, not enabled.
        GC:            Included Boehm (with typed GC and Parallel Mark)

和错误:

chris@x-ngx4:~/click/beta/Debug$ mono ConsoleApplication2.exe
System.IO.IOException: Internal error (no progress possible) Flush
  at System.IO.Compression.DeflateStream.CheckResult (Int32 result, System.String where) [0x00000] in <filename unknown>:0
  at System.IO.Compression.DeflateStream.Flush () [0x00000] in <filename unknown>:0
  at System.IO.Compression.GZipStream.Flush () [0x00000] in <filename unknown>:0
  at Raven.Abstractions.Connection.HttpRequestHelper.WriteDataToRequest (System.Net.HttpWebRequest req, System.String data, Boolean disableCompression) [0x00000] in <filename unknown>:0
  at Raven.Client.Connection.HttpJsonRequest.Write (System.String data) [0x00000] in <filename unknown>:0
  at Raven.Client.Connection.ServerClient.DirectBatch (IEnumerable`1 commandDatas, System.String operationUrl) [0x00000] in <filename unknown>:0
  at Raven.Client.Connection.ServerClient+<>c__DisplayClass68.<Batch>b__67 (System.String u) [0x00000] in <filename unknown>:0
  at Raven.Client.Connection.ReplicationInformer.TryOperation[BatchResult[]] (System.Func`2 operation, System.String operationUrl, Boolean avoidThrowing, Raven.Abstractions.Data.BatchResult[]& result) [0x00000] in <filename unknown>:0

【问题讨论】:

  • RavenDB 的版本好吗?
  • 2.0.2170-在客户端和服务器上不稳定
  • 在定义文档的时候使用普通类而不是匿名类有区别吗?
  • 作为参考,这里是指向 raven 的 HttpRequestHelper 以及 GZipStreamDeflateStream 的单声道实现的链接。但是仍然找不到根本原因。
  • 好的,我想我明白了。看我的回答。谢谢。

标签: mono ravendb gzipstream


【解决方案1】:

我想我找到了。 DeflateStream 具有对 zlib 的外部引用。如果你看zlib header file,你会发现一些cmets:

deflate() 如果取得了一些进展,则返回 Z_OK(更多输入 处理或产生更多输出),Z_STREAM_END 如果所有输入都已 已消耗并且所有输出都已生成(仅当刷新设置为 Z_FINISH), Z_STREAM_ERROR 如果流状态不一致(对于 例如,如果 next_in 或 next_out 为 Z_NULL),如果没有进展,则为 Z_BUF_ERROR 是可能的(例如avail_in 或avail_out 为零)。 请注意 Z_BUF_ERROR 不是致命的,deflate() 可以再次调用更多 输入和更多输出空间以继续压缩。

消息Internal error (no progress possible)DeflateStream 在获得Z_BUF_ERROR 时返回的消息 - 但它不会继续,它会将其视为硬停止。它应该将其视为警告并继续。至少,这是我的解释。

您能向单声道支持团队提出这个问题吗?我在那个组里不活跃。谢谢。

【讨论】:

  • 哦,这很有趣。嗯,待定。我将该 API 称为“已损坏”-恕我直言,状态代码不应将名称“错误”用于实际上不是致命错误条件的情况。好吧,这应该很容易解决,但我想知道Flush()CloseZStream() 是否也可以在非致命情况下返回Z_BUF_ERROR
  • 我已将详细信息通过电子邮件发送给他们。早些时候我删除了压缩,怀疑 GZipStream 存在问题,但这并没有解决它。相反,我得到了一个“401”——这毫无意义,因为我没有使用身份验证。当我添加身份验证详细信息时,我得到了相同的响应。我明天要更详细地调查。然而,fiddler 没有合作,所以将使用wireshark 来看看发生了什么。我会相应地在这里更新。干杯!
  • 最好知道 ReadZStream() 正在调用哪些数据 - 也许这是 zlib 出于某种原因不喜欢的东西,比如损坏的数据或类似的东西。
  • @Chris - 您可以设置store.JsonRequestFactory.DisableRequestCompression = true 并在使用wireshark 或类似工具捕获http 时运行它吗?然后,请求正文应显示尝试通过 gzip 的未压缩值。
  • @MattJohnson 通过 Fiddler 搞定了 - 结果证明 mono 没有发送任何身份验证头...我认为这个问题可能与 stackoverflow.com/questions/8392439/…
猜你喜欢
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 1970-01-01
  • 2015-08-04
  • 2014-04-04
  • 2022-01-17
相关资源
最近更新 更多