2012-01-13 4 views
0

У меня есть служба WCF, опубликованная на определенном адресе, и я хочу связаться с ней через прокси, сгенерированные в Visual Studio.Укажите порт источника клиента WCF

Я хочу, чтобы сообщения из моего прокси были отправлены с определенным TCP-портом источника, но, по-видимому, он назначает случайный порт для каждого вызова.

Проблема заключается в следующем: у меня есть два хоста A и B, на которых запущена служба WCF (то же самое на каждом хосте), хост A имеет услугу по адресу AdA и порта PA, хост B по адресу AdB и порт PB. Хост A отправляет сообщение на хост B. Хост B выполняет некоторые внутренние операции после сообщения, а затем отправляет сообщение на узел A. Проблема заключается в том, что, когда Host A вызывает веб-метод на B, он отправляет TCP-сообщение со случайным src порт, а тот, который делает не, соответствует порту, на котором A имеет услугу, поэтому веб-метод не вызывается на A, потому что исходный порт, назначенный WCF, не соответствует порту, на который публикуется служба.

Я до сих пор использовал BasicHttpBinding.

Как я могу это достичь?

Спасибо.

+0

Может быть, лучше сообщить сообществу ПОЧЕМУ вам это нужно? – adontz

+0

Какое обязательное вы используете? –

+0

Указывается дополнительно. –

ответ

0

NetPeerTcpBinding позволяет указать номер исходящего порта.

+0

Это обязательство устарело в .NET 4.5 –

0

Я не думаю, что можно назначить порт источника для любого сетевого общения, поскольку он должен быть уникальным.

Исходный порт является следующим доступным номером, назначенным TCP/IP для клиента . Это присвоенное число - это то, как метод преобразования сетевого адреса определяет, к какому пользователю следует отправлять ответы (см. NAT). Хотя тот же номер клиента может использоваться одновременно в пределах тысяч организаций, каждая сеть TCP/IP отслеживает свои собственные номера для использования только в пределах этой сети. Комбинация номера порта и IP-адреса называется «сокетом».

Подробнее: http://www.answers.com/topic/port-number#ixzz1jLxPzCVe

+1

Это неверно, NAT используется для сопоставления частных адресов и портов с NAT-отображенными общедоступными адресами и портами.Кроме того, ваше определение сокета также неверно; тем более, что в основном существуют два типа сокетов, UDP и TCP; Сокеты UDP идентифицируются по IP-адресу источника и номеру порта, TCP идентифицируются по IP-адресу источника, исходному порту, целевому IP-адресу, целевому порту. Номера портов не обязательно должны быть уникальными, они фактически перерабатываются и используются для демультиплексирования транспортного уровня. –

+0

Класс TcpClient имеет конструктор, который принимает локальную конечную точку (ip и порт). – Despertar

0

Проблема заключается в том, что, когда узел A вызывает WebMethod на B, он посылает сообщение TCP со случайным Src портом, и тот, который не соответствует порт на котором A имеет размещенную службу, поэтому веб-метод не является , вызываемым на A, потому что исходный порт, назначенный WCF, не соответствует порту, услуга которого опубликована.

Нет причин, по которым веб-метод A должен быть вызван только потому, что он получает ответ от другой веб-службы. Вы должны явно обратиться к службе. Если вы хотите, чтобы A был вызван в ответ на вызов B, тогда код в службе B должен выполнить этот вызов. Хотя, если у вас есть два метода, которые звонят друг другу, это будет просто назад и вперед, поэтому вам нужно условие выхода. Возможно, если вы дадите более подробную информацию о том, что вы пытаетесь выполнить, я могу предложить больше советов.

Смежные вопросы