Usually, when we are developing WCF clients, we have a machine that has only one network adapter. This means that there is only one LAN network that we can use. In 99.99% of scenarios this will work perfect.
What happens when we have two or three networks adapters and each WCF client need to be use a specific one? For example we can have a private network between our machine and company network. Another one can be between our machine and internet and the last one can be a secure network between us and a partner.
For this cases, the default settings of WCF client will not work. We need to be able to specify what network we want to use for each WCF client. I looked over the firewall configuration and routing tables, but I did not found a solution on this side.
A possible solution that I found over the internet and was tested by myself also is using ServiceEndpoint.
WCF give you the possibility to create a ServiceEndpoint for each IP/URL that you want to use (on the process level). In the moment when a request is made, the ServiceEndpoint will be used to resolve the client endpoint IP.
At this level we can define a delegate that can be used to specify what IP needs to be used for each request. Because, when we create a ServiceEndpoint we specify the service endpoint address, we can have different server endpoints that will use different local IP.
The BindIPEndPontDelegate delegate is called when the client IP needs to be resolved. When the local IP is specified in the callback we need to give a valid IP address of our machine, otherwise we will end up with an error. Don’t forget that this information can be cached by WCF. Also, we don’t specify a callback, the default behavior will be used.
The code would look like this:
Do you have other solutions that don’t involve writing code? Maybe doing some configuration on the local machine.
What happens when we have two or three networks adapters and each WCF client need to be use a specific one? For example we can have a private network between our machine and company network. Another one can be between our machine and internet and the last one can be a secure network between us and a partner.
For this cases, the default settings of WCF client will not work. We need to be able to specify what network we want to use for each WCF client. I looked over the firewall configuration and routing tables, but I did not found a solution on this side.
A possible solution that I found over the internet and was tested by myself also is using ServiceEndpoint.
WCF give you the possibility to create a ServiceEndpoint for each IP/URL that you want to use (on the process level). In the moment when a request is made, the ServiceEndpoint will be used to resolve the client endpoint IP.
At this level we can define a delegate that can be used to specify what IP needs to be used for each request. Because, when we create a ServiceEndpoint we specify the service endpoint address, we can have different server endpoints that will use different local IP.
The BindIPEndPontDelegate delegate is called when the client IP needs to be resolved. When the local IP is specified in the callback we need to give a valid IP address of our machine, otherwise we will end up with an error. Don’t forget that this information can be cached by WCF. Also, we don’t specify a callback, the default behavior will be used.
The code would look like this:
ServicePoint servicePoint =
ServicePointManager.FindServicePoint(
new Uri("https://www.myService.com/Services/Payment/"));
servicePoint.BindIPEndPointDelegate =
(sp, rm, retryCount) =>
{
return new IPEndPoint(myIpAddress, portNumber);
};
In the callback, we can specify any IP to be used by using IPAddress.Any.Do you have other solutions that don’t involve writing code? Maybe doing some configuration on the local machine.
Wouldn't be easier to just add a specific route table entry for that particular case?
ReplyDelete(route add.. command)
do you got any solution because i am also facing same issue.
ReplyDeleteGreat Article
ReplyDeleteWCF Training