locked
Silverlight e Web Services RRS feed

  • Pergunta

  • Pessoal.
    Estou com o seguinte problema em minha (primeira) aplicação.
    Tenho uma combo (CmbEstado) que dispara um evento (CmbEstado_SelectionChanged) que chama um 2 métodos (PopularFiltroMacroRegiao e PopularFiltroMunicipio). Cada um desses métodos chama uma mesma referência de web service mas 2 métodos diferentes. Estes 2 métodos populam outras combos que tenho na tela.
    O problema que acontece, é que 90% das vezes tudo funciona corretamente, e os dados carregados do web service são adicionados nas outras combos.
    Os 10% são as vezes que que o web service não me retorna nenhum registro (sem nenhum erro / exceção).
    Já testei os web services exaustivamente e em 100% dos casos ele funcionou corretamente.
    Verifiquei o código para analisar se os parâmetros estavam sendo passados corretamente para os web services, e em todos os testes que fiz, todos estavam sendo passados, até mesmo nos web services que não retornavam registros.

    Minha pergunta é: Existe algum problema com acesso a 2 web services simultâneamente? Tenhou outros acessos a web services na aplicação e em nenhuma
    ocorre o mesmo problema.

    Minha máquina é um Windows XP SP3. Todos os web services estão hospedadas no IIS nela (.asmx). Visual Studio 2008 e Silverlight 3.
    Obrigado pela ajuda pessoal!!!

    Seguem alguns blocos de código:

    MainPage.xaml

    <TextBlock Foreground="MidnightBlue" Margin="10,2,10,2">* Estado</TextBlock>
                                <ComboBox Margin="10,2,10,2" Name="CmbEstado" DisplayMemberPath="Nome" SelectionChanged="CmbEstado_SelectionChanged">
                                </ComboBox>
                                <TextBlock Foreground="MidnightBlue" Margin="10,2,10,2">Macro-Região</TextBlock>
                                <ComboBox Margin="10,2,10,2" Name="CmbMacroRegiao" DisplayMemberPath="Nome" SelectionChanged="CmbMacroRegiao_SelectionChanged">
                                </ComboBox>

    MainPage.xaml.cs

    private void CmbEstado_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (CmbEstado.SelectedIndex > 0)
                {
                    PopularFiltroMacroRegiao();
                    PopularFiltroMunicipio();
                }
            }

    private void PopularFiltroMacroRegiao()
            {
                MacroRegiao Selecione = new MacroRegiao();
                Selecione.Id = 0;
                Selecione.Nome = "Carregando...";
                CmbMacroRegiao.Items.Clear();
                CmbMacroRegiao.Items.Add(Selecione);
                CmbMacroRegiao.SelectedIndex = 0;
                if (CmbEstado.SelectedIndex > 0)
                {
                    UnidadeFederativa UFSelecionada = (UnidadeFederativa)CmbEstado.SelectedItem;
                    WS_Localidades.LocalidadesSoapClient WSGL = new WS_Localidades.LocalidadesSoapClient();
                    WSGL.ListarMacroRegioesCompleted += new EventHandler<WS_Localidades.ListarMacroRegioesCompletedEventArgs>(PopularFiltroMacroRegiao_Completed);
                    WSGL.ListarMacroRegioesAsync(UFSelecionada.Id);
                }
            }

            public void PopularFiltroMacroRegiao_Completed(object sender, WS_Localidades.ListarMacroRegioesCompletedEventArgs e)
            {
                MacroRegiao Selecione = new MacroRegiao();
                Selecione.Id = 0;
                Selecione.Nome = "-- Selecione --";
                CmbMacroRegiao.Items.Clear();
                CmbMacroRegiao.Items.Add(Selecione);
                CmbMacroRegiao.SelectedIndex = 0;
                if (e.Result.Count > 0)
                {
                    foreach (MacroRegiao MR in e.Result)
                    {
                        CmbMacroRegiao.Items.Add(MR);
                    }
                }
            }

    private void PopularFiltroMunicipio()
            {
                Municipio Selecione = new Municipio();
                Selecione.Id = 0;
                Selecione.Nome = "Carregando...";
                CmbMunicipio.Items.Clear();
                CmbMunicipio.Items.Add(Selecione);
                CmbMunicipio.SelectedIndex = 0;
                if (CmbEstado.SelectedIndex > 0 || CmbRegiao.SelectedIndex > 0)
                {
                    int ReFiltro = 0;
                    int UFFiltro = 0;
                    if (CmbRegiao.SelectedIndex > 0)
                    {
                        Regiao ReSelecionada = (Regiao)CmbRegiao.SelectedItem;
                        ReFiltro = ReSelecionada.Id;
                    }
                    if (CmbEstado.SelectedIndex > 0)
                    {
                        UnidadeFederativa UFSelecionada = (UnidadeFederativa)CmbEstado.SelectedItem;
                        UFFiltro = UFSelecionada.Id;
                    }
                    WS_Localidades.LocalidadesSoapClient WSGL = new WS_Localidades.LocalidadesSoapClient();
                    WSGL.ListarMunicipiosCompleted += new EventHandler<WS_Localidades.ListarMunicipiosCompletedEventArgs>(PopularFiltroMunicipio_Completed);
                    WSGL.ListarMunicipiosAsync(UFFiltro, ReFiltro);
                }
            }

            public void PopularFiltroMunicipio_Completed(object sender, WS_Localidades.ListarMunicipiosCompletedEventArgs e)
            {
                Municipio Selecione = new Municipio();
                Selecione.Id = 0;
                Selecione.Nome = "-- Selecione --";
                CmbMunicipio.Items.Clear();
                CmbMunicipio.Items.Add(Selecione);
                CmbMunicipio.SelectedIndex = 0;
                if (e.Result.Count > 0)
                {
                    foreach (Municipio Mu in e.Result)
                    {
                        CmbMunicipio.Items.Add(Mu);
                    }
                }
            }
    quinta-feira, 10 de setembro de 2009 15:00

Respostas

  • Achei o erro.
    O problema é que, nos web services que estavamos acessando, a camada DAL estava utilizando Singleton para o objeto de conexão com o banco de dados.
    E como estavam sendo feitos várias requisições pela mesma sessão, estava gerando conflito nas consultas.
    • Marcado como Resposta SxMarcos quinta-feira, 17 de setembro de 2009 12:41
    quinta-feira, 17 de setembro de 2009 12:41

Todas as Respostas

  • Consegui resolver o problema chamando um web service no final do evento "completed" do outro.
    Agora, existem casos onde realmente são necessários chamar 2 web services simultâneos. São esses casos que não consegui fazer funcionar direito.
    Quando chamo dois ou mais web services simultâneamente, ou funciona, ou não tráz nenhum registro (ele acessa o web service mas não traz registros) ou tráz os registro e conflita o destino dos dados (ex: 2 web services para popular 2 combosbox, inverte os resultados).
    Pessoal, estou mandando meus arquivos de configuração pq não sei mais o que fazer para arrumar isso. Varri a internet em busca de soluções mas nada. Estou começando a achar que é apenas na minha máquina que isto ocorre.

    ServiceReferences.ClientConfig

    <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="LocalidadesSoap" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
                        <security mode="None" />
                    </binding>
                    <binding name="EntidadesSoap" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
                        <security mode="None" />
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://smwork/WS/Entidades.asmx"
                    binding="basicHttpBinding" bindingConfiguration="EntidadesSoap"
                    contract="WS_Entidades.EntidadesSoap" name="EntidadesSoap" />
                <endpoint address="http://smwork/WS/Localidades.asmx"
                    binding="basicHttpBinding" bindingConfiguration="LocalidadesSoap"
                    contract="WS_Localidades.LocalidadesSoap" name="LocalidadesSoap" />
            </client>
        </system.serviceModel>
    </configuration>

    ClientAccessPolicy.xml

    <?xml version="1.0" encoding="utf-8"?>
    <access-policy>
        <cross-domain-access>
            <policy>
                <allow-from http-request-headers="*">
                    <domain uri="*"/>
                </allow-from>
                <grant-to>
                    <resource path="/" include-subpaths="true"/>
                </grant-to>
            </policy>
        </cross-domain-access>
    </access-policy>
    quarta-feira, 16 de setembro de 2009 12:49
  • Achei o erro.
    O problema é que, nos web services que estavamos acessando, a camada DAL estava utilizando Singleton para o objeto de conexão com o banco de dados.
    E como estavam sendo feitos várias requisições pela mesma sessão, estava gerando conflito nas consultas.
    • Marcado como Resposta SxMarcos quinta-feira, 17 de setembro de 2009 12:41
    quinta-feira, 17 de setembro de 2009 12:41