Połączenie z MySQL w Windows Phone 8.1

0

Witam serdecznie,

Chciałem przetestować sobie dostęp do bazy danych w aplikacjach pod Windows Phone. Wiem, że nie można odwoływać się bezpośrednio do bazy danych, dlatego do tego celu utworzyłem próbną usługę sieciową za pomocą WCFa. Poniżej kod:

public class Service1 : IService1
{

    public string PobierzHandlowca()
    {
        String sql = "SELECT nazwa FROM Handlowcy WHERE id_handlowcy=1";
        MySqlConnection connection = new MySqlConnection("Server=localhost; Database=msoh; Uid=root; Pwd=;");

        try
        {
            connection.Open();
            MySqlCommand command = new MySqlCommand(sql, connection);
            MySqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                return (string)reader["nazwa"];
            }
        }
        catch { }
        finally   
        {
            connection.Dispose();
        }

        return null;
    }
}

Następnie utworzyłem drugi projekt (Windows Phone Silverlight Application) i dodałem do niego service reference, którym była oczywiście moja wcześniej utworzona testowa usługa. Ma to działać tak, że po naciśnięciu przycisku ma się pobrać z bazy i wyświetlić nazwa handlowca zgodnie z podaną na sztywno kwerendą. Poniżej kod:

public partial class MainPage : PhoneApplicationPage
{
    ServiceReference1.Service1Client proxy;


    public MainPage()
    {
        InitializeComponent();

        proxy = new Service1Client();
        proxy.PobierzHandlowcaCompleted += proxy_PobierzHandlowcaCompleted;          
    }


    void proxy_PobierzHandlowcaCompleted(object sender, PobierzHandlowcaCompletedEventArgs e)
    {
        if (e.Result != null)
        {
            tbHandlowiec.Text = e.Result;   // tbHandlowiec to TextBox
        }
        else
        {
            tbHandlowiec.Text = "Error!";
        }
    }

    // button
    private void btnPobierzHandlowca_Click(object sender, RoutedEventArgs e)
    {
        proxy.PobierzHandlowcaAsync();
    }
}

Po nacisnięciu przyciku, po około 5-6 sekundach następuje błąd: System.ServiceModel.CommunicationException' occurred in System.ServiceModel.ni.dll but was not handled in user code. Czy ktoś jest w stanie powiedzieć mi co tutaj jest źle ?

1

Dodaj sobie testy do serwisu by sprawdzić czy dziala lub sprawdź na zwykłej aplikacji konsolowej. Możesz jeszcze dodać do WCF trace by widzieć więcej szczegółów.

0

Serwis działa, metoda pobiera nazwę handlowca. Tylko tutaj pytanie - może być przyczyną fakt, że usługa sieciowa łączy się z bazą na moim komputerze zamiast gdzieś na serwerze? Bo używam tutaj localhosta do połączenia i może dlatego nie mogę się z telefonu połączyć do niej?

Poniżej screen z błędem, który otrzymuję:
BdPNG_whwrnxr.PNG

1

Sprawdź, do jakiego serwera WCF (do jakiego hosta) próbuje się podłączyć telefon, bo jak do localhost, to localhost wskaże przecież na 127.0.0.1, czyli na telefon, nie na twój komputer.

0

No właśnie! W pliku konfiguracyjnym aplikacji Windows Phone - ServiceReferences.ClientConfig widnieje coś takiego:

<endpoint address="http://localhost:9728/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
                name="BasicHttpBinding_IService1" />

Czyli przypuszczam, że jest tak jak piszesz, czyli próbuje się telefon połączyć do localhosta, a nie do komputera
I ogólnie adres usługi to: http://localhost:9728/Service1.svc?wsdl

1

Tak, telefon próbuje łączyć się sam ze sobą. Zmień adres endpointa na adres IP (numeryczny) swojego komputera (zarówno z wirtualnej karty sieciowej łączącej z telefonem, jak i tej łączącej z internetem) i powinno działać.

0

Wystarczy wewnętrzny adres w sieci? Bo zarówno telefon jak i komputer są w tej samej sieci. Komputer ma w takim razie adres 192.168.1.20. Gdy zmieniam i wpisuję w endpoincie zamiast localhosta ten adres to błąd jest dalej ten sam. Ale myślę że źle tutaj trochę rozumuję... Ten port 9728, skąd on się wziął? Czy ten port wchodzi po prostu w zakres portów dotyczących usług? Jeśli zmieniam endpointa na http://192.168.1.20:9728/Service1.svc to dalej jest to samo. Natomiast w przeglądarce 192.168.1.20/phpmyadmin to normalnie odpala się MySQL.

Proszę naprowadź mnie jak to ugryźć.

1

Tak, jeżeli są w tej samej sieci, to wystarczy wewnętrzny adres sieci.

Jeżeli masz inny komputer, to spróbuj się z niego podłączyć do 192.168.1.20:9728 (na przykład przez Telnet, czy inne narzędzie tego typu), bo ja mam proste przypuszczenie, że po prostu firewall blokuje ci połączenia z zewnątrz na taki port. Możesz wejść w ustawienia Firewalla Windows i ręcznie dodać wyjątek dla swojej aplikacji albo portu.

0

Ciekawa sprawa:
Przy włączonym firewallu otrzymuję komunikat taki jak na screenie był widoczny wyżej, czyli : Additional information: The remote server returned an error: NotFound.
Natomiast po wyłączeniu całkowitym firewalla, dostaję taki oto komunikat: Additional information: There was no endpoint listening at http://192.168.1.20:9728/Service1.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. In Silverlight, a 404 response code may be reported even when the service sends a different error code.

Błąd ten otrzymuję dużo szybciej, gdzieś po 2-3 sekundach. Sprawdzę zaraz jeszcze tak jak napisałeś z innego komputera podłączyć się do 192.168.1.20:9728 i zdam relację.

EDIT:
Właśnie spróbowałem połączyć się pod ten adres z laptopa, który jest też w tej samej sieci co komputer. Użyłem do tego putty. Co ciekawe, w pole adres wpisuję 192.168.1.20, w port wpisuję 9728 i zaznaczam typ połączenia Telnet. Pojawia się te czarne okienko i po sekundzie znika. Nie wiem co to może oznaczać...

0

Rozwiązanie problemu znajduje się na stronie MS link

1
XardasLord napisał(a):

Ciekawa sprawa:
Przy włączonym firewallu otrzymuję komunikat taki jak na screenie był widoczny wyżej, czyli : Additional information: The remote server returned an error: NotFound.
Natomiast po wyłączeniu całkowitym firewalla, dostaję taki oto komunikat: Additional information: There was no endpoint listening at http://192.168.1.20:9728/Service1.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details. In Silverlight, a 404 response code may be reported even when the service sends a different error code.

Błąd ten otrzymuję dużo szybciej, gdzieś po 2-3 sekundach. Sprawdzę zaraz jeszcze tak jak napisałeś z innego komputera podłączyć się do 192.168.1.20:9728 i zdam relację.

EDIT:
Właśnie spróbowałem połączyć się pod ten adres z laptopa, który jest też w tej samej sieci co komputer. Użyłem do tego putty. Co ciekawe, w pole adres wpisuję 192.168.1.20, w port wpisuję 9728 i zaznaczam typ połączenia Telnet. Pojawia się te czarne okienko i po sekundzie znika. Nie wiem co to może oznaczać...

Sprawdź, na jakim adresie nasłuchuje twoja usługa WCF. Bo skoro była skonfigurowana na localhost, to może słucha (binduje się) tylko do localhost i nie przyjmie połączeń przychodzących z zewnątrz.

W Windows Phone błąd "NotFound" to niestety może oznaczać dowolny błąd sieciowy, wliczając w to Connection Refused. I to chyba jest twoja sytuacja z firewallem - komputer docelowy aktywnie odmawia połączenia.

putty powinno oczekiwać - powinna być możliwość podania tekstu i wykonania zapytania HTTP.

0

Dzięki za zainteresowanie tematem :)

Sprawdź, na jakim adresie nasłuchuje twoja usługa WCF. Bo skoro była skonfigurowana na localhost, to może słucha (binduje się) tylko do localhost i nie przyjmie połączeń przychodzących z zewnątrz.

Pytanie dość błahe, ale jak to sprawdzić mam?

0

Sprawdź plik konfiguracyjny swojej usługi - App.config, czy tam Web.config. Tam powinny być zdefiniowane adresy endpointów, które wystawia usługa - spróbuj zmienić "localhost" na adres IP swojego komputera i powinno śmigać.

0

No właśnie w pliku Web.config usługi mam tylko takie coś jak poniżej. Nie ma tutaj nic o adresach.

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

Ale znalazłem w Properties WCFa coś takiego:
propertie_whwqwpn.PNG

Tylko nie mogę bezpośrednio zmienić na sztywno z localhost na mój adres IP komputera bo dostaję komunikat :
blad2PNG_whwqwpw.PNG

1

Zamiast się męczyć z tym durnym IIS Express zamień konfiguracje i postaw aplikację lokalnym IIS o ile masz zainstalowany.
Uruchom VS jako administrator. Ustaw jak poniżej:
VSSet.png
Utwórz kliknij create virtual dictionary. I możesz wtedy łączyć się po localhost jak i adresie IP komputera w sieci:
WcfClient.png

0

Dzięki za odpowiedź! Nie miałem zainstalowanego lokalnego IIS więc zainstalowałem w Windowsie. W Visual Studio jako administrator pojawiło mi się Local IIS zrobiłem tak jak kazałeś. Po kliknięciu create virtual directory dostałem pomyślny komunikat.

I gdy chcę wystartować usługę dostaję taki oto błąd w przeglądarce:
Bladtworz_whspspn.PNG

1

Zainstalowałeś oprócz IIS:

  1. Internet Information Service -> World Wide Web Service -> Application Development -> ASP.NET x.x

http://www.iis.net/learn/get-started/whats-new-in-iis-8/iis-80-using-aspnet-35-and-aspnet-45

0
DibbyDum napisał(a):

Zainstalowałeś oprócz IIS:

  1. Internet Information Service -> World Wide Web Service -> Application Development -> ASP.NET x.x

Rzeczywiście, nie zainstalowałem tego wcześniej. Teraz doinstalowałem tak jak widać to na poniższym screenie:
IIS-optio_whsrneq.PNG

Teraz dostaję kolejny błąd:
blad-http_whsrnwh.PNG

Wiem że zawracam głowę każdym błędem, ale wolę go tutaj przedstawić a sam też w swoim zakresie teraz tego poszukać jak rozwiązać.

0

Jaki podajesz adres
http://XXX.XXX.X.XXX/Nazwa/NazwaSerwisu.svc
czy
http://XXX.XXX.X.XXX/Nazwa

Dla pierwszego powinno działać zawsze dla drugiego nie koniecznie.

0

No właśnie adres jest pełny, wraz z .../Service1.svc

0

Okej to możesz jeszcze sprawdzić ustawienia w:
Internet Information Services (IIS) Manager -> Twój IIS -> ISAPI or CGI Restriction. Sprawdź czy .NET v4 masz "zezwolony".
Untitled.png

0

Wielkie dzięki za zainteresowanie tematem i że chcesz mi pomóc :)

Sprawdziłem tak jak kazałeś i mam "dozwolone" co widać na poniższym screenie:

ISAPI-i-C_whsxwhx.PNG

1

Noto nic ci nie pozostaje jak tylko lecieć po kolei i próbować aż któreś rozwiązanie u Ciebie zadziała, o ile już nie próbowałeś . Mnie się pomysły skończyły.
https://www.google.pl/search?hl=en&output=search&sclient=psy-ab&q=HTTP+Error+404.3-Not+Found+in+IIS+7.5&btnG=&oq=&gs_l=&pbx=1&gws_rd=cr&ei=l1KHVNzMHZLqaJPTgrgF

1

Wielkie dzięki. Doszedłem do rozwiązania dzięki niezawodnemu stackowi. Problemem okazało się, że nie miałem aktywowanego HTTP w usługach zaawansowanych programu .NET Framework 4.5:
wcfPNG_whsnpnp.PNG

Później jeszcze pokazał się błąd 404.17 i musiałem zgodnie z zaleceniami ze stacka zainstalować ręcznie mapowanie bodajże, aż tak się nie znam na tym no ale ważne że zadziałało.
Wpisujemy to w CMD: C:\Windows\Microsoft.NET\Framework\v3.0\"Windows Communication Foundation"\ServiceModelReg.exe -i

Dziękuję bardzo DibbyDum oraz Ktos. Bez Was mogłoby mi się nie udać :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.