У меня возникла проблема с получением IPv6-адресов для работы с .NET WSE SoapTcpTransport.GetInputChannel или, точнее, SoapReceivers.Add, который использует GetInputChannel незаметно. Поскольку, похоже, ни у кого на планете нет этой проблемы, я предполагаю, что я делаю что-то не так.
Если я создаю входной канал SOAP с использованием IPv4-адреса и порта (soap.tcp: //192.168.0.198: 9063), тогда все будет в порядке. Когда я использую IPv6-адрес для того же сетевого адаптера (soap.tcp: // [fe80 :: c450: 7142: 67f5: ad66% 11]: 9063), то SoapTcpTransport.GetInputChannel выдает исключение: «System.ArgumentException: WSE813: Следующий транспортный адрес не может быть сопоставлен с интерфейсом локальной сети: soap.tcp: // [FE80: 0000: 0000: 0000: C450: 7142: 67F5: AD66]: 9063 / .. »
Единственная разница между ними заключается в том, что Uri создается с адресом IPv4 или IPv6. Оба адреса отвечают на пинг. Это поведение одинаково для Microsoft.Web.Services2 и 3. У меня есть модульный тест MS, который воспроизводит проблему:
[TestMethod]
public void ShouldConstructInputChannelWithIpv6Address_Selfcontained()
{
Uri via = new Uri("soap.tcp://[fe80::c450:7142:67f5:ad66%11]:9063");
EndpointReference receiveEndpoint = new EndpointReference(via);
SoapTcpTransport soapTransport = new SoapTcpTransport();
ISoapInputChannel inputChannel = soapTransport.GetInputChannel(receiveEndpoint, SoapChannelCapabilities.ActivelyListening);
inputChannel.Close();
Assert.IsTrue(true); // If it makes it this far without an exception, then that's progress.
}
Я задал этот тот же вопрос на форумах MSDN.