Получение .net remoting для поддержки IP v4 и v6: как отобразить поток на реальный ip, а не на исключение аргумента - PullRequest
2 голосов
/ 09 июня 2010

В моей компании существует служба .Net Remoting, предоставляющая интерфейсы внешним процессам.Я настраиваю эту службу для поддержки связи как по IP v4, так и по IP v6, имея следующий раздел app.config:

  <system.runtime.remoting>
      <application>
        <service>
          <wellknown mode="Singleton" type="type,     
           dll"objectUri="exposedname.rem" />
        </service>
        <channels>
          <channel name="tcpclient" ref="tcp" encryption="EncryptAndSign">
            <clientProviders>
              <formatter ref="binary" />
            </clientProviders>
          </channel>
          <channel ref="tcp" name="tcp6" port="9000" bindTo="[::]" 
           encryption="EncryptAndSign">
            <clientProviders>
              <formatter ref="binary" />
            </clientProviders>
          </channel>
          <channel ref="tcp" name="tcp4" port="9000" bindTo="0.0.0.0"  
           encryption="EncryptAndSign">
            <clientProviders>
              <formatter ref="binary" />
            </clientProviders>
          </channel>
        </channels>
      </application>
      <customErrors mode="off"/>
  </system.runtime.remoting>

В приведенном выше разделе файла конфигурации получает службу удаленного взаимодействия, отвечающую на не потоковые функции на обоих IPv4 и ip v6.Однако каждый раз, когда функция пытается отправить или получить поток, выдается следующее исключение ArgumentException:

  IPv4 address 0.0.0.0 and IPv6 address ::0 are unspecified addresses that
  cannot be used as a target address.
  Parameter name: hostNameOrAddress

Есть ли способ изменить app.config, чтобы служба возвращала поток, сопоставленный среальный ip и все еще поддерживает ip v4 и ip v6?Разве это не возможно в .net remoting?

Ответы [ 2 ]

1 голос
/ 22 июля 2010

Я провел дальнейшие исследования по этой проблеме и нашел решение для моей явной проблемы, используя атрибут канала 'machineName', а также 'bindTo' (см. Раздел файла конфигурации внизу).

В моем явном случае мне не нужно поддерживать соединения, входящие как с ip v4, так и с ip v6 одновременно, поскольку по конфигурации соединения будут входить только в одну из двух версий ip.Таким образом, в разделе конфигурации ниже подробно описывается настройка службы удаленного взаимодействия .net для полной связи по IP v6.Я полагаю, что это исправление конфигурации будет работать, чтобы служба реагировала как на ip v4, так и на ip v6, однако я не проверяла его, поэтому точно не знаю.

Использование атрибута канала 'machineName',службе сообщается, с каким IP-адресом связать объект потока, возвращенный из API.Таким образом, вместо того, чтобы получать исключение с неизвестным адресом [::], когда клиент пытается получить доступ к потоку, клиент получает объект потока, настроенный для обратной связи с настроенным именем сервера.

Используя атрибут канала 'bindTo', службе сообщается, какой IP-адрес прослушивать для входящей связи.Это может быть явный ip, как показано в разделе конфигурации ниже, или это может быть целый протокол («[::]» для IP v6, «0.0.0.0» для ip v4).Если вы не используете ip v6, а только ip v4, этот атрибут необходим только в том случае, если вы хотите заблокировать службу до одного явного ip.В противном случае, поскольку удаленное взаимодействие .Net автоматически предполагает ip v4, оно будет работать правильно.

Надеюсь, это немного поможет другим с ip v4 / v6.

  <system.runtime.remoting>
      <application>
        <service>
          <wellknown mode="Singleton" type="Kryptiq.Partners.Service.PartnersServiceApi, KPtnrSvc" objectUri="KPtnrSvc.rem" />
        </service>
        <channels>
          <channel name="tcpclient" ref="tcp" encryption="EncryptAndSign" 
           machineName="[fe80::839:c79e:141a:2498%15]">
            <clientProviders>
              <formatter ref="binary" />
            </clientProviders>
          </channel>
          <channel name="tcpserver" ref="tcp" port="2500" encryption="EncryptAndSign"
           machineName="[fe80::839:c79e:141a:2498%15]" 
           bindTo="[fe80::839:c79e:141a:2498%15]">
            <serverProviders>
              <formatter ref="binary" />
            </serverProviders>
          </channel>
        </channels>
      </application>
  </system.runtime.remoting>
0 голосов
/ 09 июня 2010

Я только что посмотрел этот http://connect.microsoft.com/VisualStudio/feedback/details/376712/net-remoting-tcpchannel-does-not-listen-on-ipv6 на сайте Microsoft Connect.

Похоже, что IPV6 будет работать только при отсутствии IPV4, и это в соответствии с постом является намеренным.

Давайте посмотрим, что другие должны добавить к нему.

...