WebServices не взаимодействует с приложением - PullRequest
0 голосов
/ 19 мая 2010

Проблема: (Решение в конце) Я получил приложение Silverlight с веб-проектом

Web

Silverlight

Интернет содержит сервис:

[WebService(Namespace = "svChat")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
//[System.Web.Script.Services.ScriptService]
public class GetIPService : System.Web.Services.WebService 
{

    public GetIPService () 
    {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    public string GetIp() 
    {
        return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    }
  }

И я получил класс в своем приложении Silverlight, используя Службу:

public class Client
{
    private string ip;
    private string created;

    #region Properties
    public string Ip
    {
        get { return ip; }
        set { ip = value; }
    }

    public string Created
    {
        get { return created; }
        set { created = value; }
    }
    #endregion

    public Client()
    {
    }

    public void SetIp()
    {
        ServiceReference1.GetIPServiceSoapClient scIpClient = new svChat.ServiceReference1.GetIPServiceSoapClient();
        scIpClient.GetIpCompleted += new EventHandler<svChat.ServiceReference1.GetIpCompletedEventArgs>(IpService_Completed);
        scIpClient.GetIpAsync();
    }

    private void IpService_Completed(object sender, ServiceReference1.GetIpCompletedEventArgs e)
    {
        this.ip = e.Result;
    }

}

После создания клиента вызывается SetIp () и в текстовое поле добавляется Client.Ip. Ничего не произошло. Ip = ноль.

Сам сервис работает, проверял его. Получение Ip по вышеуказанному коду работает.

Не работает получение Ip через службу через приложение Silverlight.

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="GetIPServiceSoap" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
                    <security mode="None" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:2090/svChat.Web/GetIPService.asmx"
                binding="basicHttpBinding" bindingConfiguration="GetIPServiceSoap"
                contract="ServiceReference1.GetIPServiceSoap" name="GetIPServiceSoap" />
        </client>
    </system.serviceModel>
</configuration>

Есть идеи?

С уважением,

Решение: Создание приложения Silverlight в VS 2010 (Ultimate) заставляет VS использовать один и тот же тест-сервер для приложения Silverlight и веб-сайта. Это не проблема, пока VS не использует конфигурацию Silverlight для настройки тестового сервера. Клиент Silverlight теперь не сможет правильно обращаться к веб-серверу веб-серверов. Точная причина не известна, но я думаю, что это вызвано описанной выше ситуацией. Так что начните отладку и подождите, пока сайт загрузится и появится «Exception», затем «Stop» отладки и продолжайте тестировать сайт, не беспокоясь об исключениях. Недостаток: без отладки.

1 Ответ

1 голос
/ 19 мая 2010

Полагаю, ключевым моментом является подтверждение того, что запрос к веб-сервису включает заголовок 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();
    }
...