我有一个Mono .NET应用程序,它使用ppatierno.AzureSBLite从Azure ServiceBus接收数据。
代码很简单:
var factory = MessagingFactory.CreateFromConnectionString(connectionString);
var client = factory.CreateEventHubClient(eventHubEntity);
var group = client.GetDefaultConsumerGroup();
var receiver = group.CreateReceiver(partitionId, startingDateTimeUtc);
EventData = receiver.Receive();
在运行64位Ubuntu 16.04的虚拟机上,使用Ubuntu的Mono软件包,它可以完美运行。
在运行Ubuntu 14.04的构建服务器上,在64位16.04 chroot中(因此chroot环境应该具有与VM相同的所有用户域包),使用Ubuntu的Mono包,我收到以下错误:
System.Net.Sockets.SocketException: Invalid arguments
at System.Net.Sockets.Socket.BeginMConnect (System.Net.Sockets.SocketAsyncResult sockares) <0x41029e20 + 0x001df> in <filename unknown>:0
at System.Net.Sockets.Socket.BeginConnect (System.Net.IPAddress[] addresses, Int32 port, System.AsyncCallback callback, System.Object state) <0x41029720 + 0x00107> in <filename unknown>:0
at System.Net.Sockets.Socket.BeginConnect (System.String host, Int32 port, System.AsyncCallback callback, System.Object state) <0x41027720 + 0x0008f> in <filename unknown>:0
at Amqp.TcpTransport+<>c__DisplayClass3.<ConnectAsync>b__0 (System.AsyncCallback c, System.Object s) <0x41027670 + 0x00073> in <filename unknown>:0
at System.Threading.Tasks.TaskFactory`1[TResult].FromAsyncImpl (System.Func`3 beginMethod, System.Func`2 endFunction, System.Action`1 endAction, System.Object state, TaskCreationOptions creationOptions) <0x7fc54c2c8700 + 0x001cf> 24334 in <filename unknown>:0
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () <0x7fc54c0016d0 + 0x00029> in <filename unknown>:0
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) <0x7fc54bfff6b0 + 0x000a7> in <filename unknown>:0
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) <0x7fc54bfff630 + 0x0006b> in <filename unknown>:0
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) <0x7fc54bfff5e0 + 0x0003a> in <filename unknown>:0
at System.Runtime.CompilerServices.TaskAwaiter.GetResult () <0x7fc54bfff5c0 + 0x00012> in <filename unknown>:0
at Amqp.TcpTransport.Connect (Amqp.Connection connection, Amqp.Address address, Boolean noVerification) <0x410219b0 + 0x0015e> in <filename unknown>:0
at Amqp.Connection.Connect (Amqp.Sasl.SaslProfile saslProfile, Amqp.Framing.Open open) <0x41021680 + 0x0006b> in <filename unknown>:0
at Amqp.Connection..ctor (Amqp.Address address, Amqp.Sasl.SaslProfile saslProfile, Amqp.Framing.Open open, Amqp.OnOpened onOpened) <0x4101ba40 + 0x00227> in <filename unknown>:0
at Amqp.Connection..ctor (Amqp.Address address) <0x4101b9b0 + 0x0001b> in <filename unknown>:0
at ppatierno.AzureSBLite.Messaging.Amqp.AmqpMessagingFactory.Open (System.String entity) <0x4101b760 + 0x001b7> in <filename unknown>:0
at ppatierno.AzureSBLite.Messaging.Amqp.AmqpMessageReceiver.ReceiveEventData () <0x4101afb0 + 0x00042> in <filename unknown>:0
at ppatierno.AzureSBLite.Messaging.EventHubReceiver.Receive () <0x4101ab40 + 0x0001f> in <filename unknown>:0
at ReceiveEdgeData.EdgeReceiver.MainLoop () <0x4101a920 + 0x0004b> in <filename unknown>:0
如果我正确理解strace输出,则无效主机正在创建IPv6套接字并尝试直接连接到IPv4地址:
connect(4, {sa_family=AF_INET, sin_port=htons(5671), sin_addr=inet_addr("52.176.47.198")}, 16) = -1 EINVAL (Invalid argument)
当正常运行的主机使用类似dual-mode sockets的内容将IPv4地址正确表示为IPv6地址时:
connect(4, {sa_family=AF_INET6, sin6_port=htons(5671), inet_pton(AF_INET6, "::ffff:52.176.47.198", &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=0}, 28) = -1 EINPROGRESS (Operation now in progress)
鉴于Mono及其依赖项内部正在发生这种情况,我该如何排除故障并解决此问题?