Полагаю, ключевым моментом является подтверждение того, что запрос к веб-сервису включает заголовок Http HTTP_X_FORWARDED_FOR
, который обычно добавляется прокси-сервером или балансировщиком нагрузки.
Если этот заголовок не существует, то результат вызова
HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
- это ноль, это то, что вы видите. Поскольку конечная точка, которую вы показываете в конфигурации, указывает на localhost, вы определенно не проходите через прокси или балансировщик нагрузки, поэтому заголовок HTTP_X_FORWARDED_FOR
не будет добавлен.
http://localhost:2090/svChat.Web/GetIPService.asmx
Если вы не проходите через прокси-сервер или балансировщик нагрузки, вы можете использовать REMOTE_ADDR (с различной степенью успеха)
HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]
Несмотря на это, вам, вероятно, следует написать свой код, чтобы учесть тот факт, что ни один из них на самом деле не может иметь ничего установленного. Вы не можете предполагать, что каждый прокси или балансировщик добавят заголовок HTTP_X_FORWARDED_FOR
, если вы не контролируете все компоненты infrastrucutre между клиентом и сервером.
Обновление: на основе предоставленного вами кода, вот изменения, которые я сделал.
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Page_Loaded);
this.MainClient = new Client();
ClientList.Clients.Add(this.MainClient);
// Removed LoadXMLFile call here, constructor runs before Loaded event.
//LoadXMLFile();
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
svChat.ServiceReference1.GetIPServiceSoapClient scIpClient = new svChat.ServiceReference1.GetIPServiceSoapClient();
scIpClient.GetIpCompleted += new EventHandler<svChat.ServiceReference1.GetIpCompletedEventArgs>(IpService_Completed);
scIpClient.GetIpAsync();
}
public void IpService_Completed(object sender, svChat.ServiceReference1.GetIpCompletedEventArgs e)
{
this.MainClient.Ip = e.Result;
// Probably where you should call LoadXMLFile
// at this point the async call has returned and
// the ip is intitialized.
LoadXMLFile();
}