Niedziałająca usługa- gdzie leży problem?

0

Napisałem aplikację, która korzysta z Web Service'u (pobiera z niego dane). Gdy otwieram aplikację przez Visual Studio, przy uruchomionej usłudze-również w Visual Studio w osobnej Solucji wszystko jest ok. Gdy otwieram aplikację z folderu bin/debug i usługę z Visual Studio też jest ok. Problem pojawia się gdy pozamykam projekty i odpalam samą aplikację z bin/debug. Wtedy aplikacja nie zwraca niczego, podczas logowania do aplikacji powinna wyświetlić błąd lub przejść dalej, a tutaj przycisk chwilę jest nieaktywny i to tyle.

Z tego co zaobserwowałem to samo odpalenie aplikacji nie uruchamia usługi (IIS Express nic nie pokazuje). Gdzie może leżeć przyczyna?

0

To dość oczywiste, że uruchomienie jednej aplikacji nie uruchamia dwóch. Wdroż usługę na IIS i uruchom ją.

0

Mam w aplikacji dodane odwołanie do usługi. Chyba, że to nie o to chodzi? Z tego co wiem to usługa ma działać w tle od uruchomienia, więc myślałem, że odwołanie załatwi sprawę?

0

A czy otwierajac przegladarke internetową i wklepując 4programmers.net uruchamiasz tym samym serwery 4programmers?:) To co opisujesz to 2 niezalezne aplikacje, jedna korzysta z informacji dostarczonych przez drugą (o ile ta druga jest uruchomiona)

0

Rozumiem, jednak jak w takim razie mogę uruchomić tą usługę bez visual studio, a najlepiej tak aby przy uruchamianiu aplikacji się uruchamiała i czekała na wywołanie metody? Aplikacja to dodatek do większego systemu, więc może muszę "poziom wyżej" uruchamiać najpierw tą usługę? Dzięki za pomoc i przepraszam za mały poziom wiedzy, ale dopiero się uczę.

0

Rozumiem, jednak jak w takim razie mogę uruchomić tą usługę bez visual studio, a najlepiej tak aby przy uruchamianiu aplikacji się uruchamiała i czekała na wywołanie metody?

Musisz trochę lepiej opisać, co właściwie robisz. Twoja aplikacja to aplikacja okienkowa (lub konsolowa), która próbuje pobrać dane z webservice'u, tak?
Ten webservice to całkiem zewnętrzna usługa, czy jakiś oddzielny projekt w VS? Jak dodajesz referencję do niego? Jak pobierasz dane z webservice'u?

Wtedy aplikacja nie zwraca niczego, podczas logowania do aplikacji powinna wyświetlić błąd lub przejść dalej, a tutaj przycisk chwilę jest nieaktywny i to tyle.

Daj ten fragment kodu w try/catch i w catchu coś takiego:

MessageBox.Show(e.Message + "\r\n" + e.StackTrace);

Może pomoże, choć tak prawdę powiedziawszy to z opisu nie wygląda jak wyjątek, tylko skaszaniona logika. Tego nie rozwiążemy bez kodu.

0

Aplikacja okienkowa zrobiona zgodnie ze wzorcem MVVM. Usługa została przygotowana przeze mnie w oddzielnym projekcie, solucji w VS. Referencję dodaje poprzed Add Service Reference, wklejam adres url http://localhost:51158/ i mi ją znajduję. Tak jak powiedziałem aplikacja działa, jeśli uruchomię usługę z poziomu Visual Studio (uruchamia się Mozilla z adresem: http://localhost:51158/). Jeśli odpalam samą aplikację (w VS, logowania jeszcze nie dodałem, więc nie mam jak sprawdzić co zwraca wersja "finalna") bez odpalonej usługi otrzymuję wyjątek (myślę, że występuje taki sam podczas odpalenia aplikacji normalnie- nie z poziomu VS):

  • $exception	{"There was no endpoint listening at http://localhost:51158/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."}
    

Mam sporo ViewModeli, więc ciężko mi umieścić tutaj całą logikę, dlatego umieszczam na początek web.config i api.config, może coś tutaj nie pasuje:

api.config :

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <connectionStrings>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IZad1Service" closeTimeout="00:50:00"
    openTimeout="00:50:00" receiveTimeout="00:50:00" sendTimeout="00:50:00"
    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
    maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"
    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
    useDefaultWebProxy="true">
          <readerQuotas maxDepth="128" maxStringContentLength="2147483647"
            maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:51158/Service1.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IZad1Service" contract="MyWebService.IZad1Service"
        name="BasicHttpBinding_IZad1Service" />
    </client>
  </system.serviceModel>
</configuration>

web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <system.serviceModel>
    <serviceHostingEnvironment minFreeMemoryPercentageToActivateService="0"  aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
      <services>
        <service name="Zad1Service.Zad1Service">         
          <endpoint
              address=""
              binding="basicHttpBinding"
              contract="Zad1Service.IZad1Service" />
        </service>
      </services> 
    <!--ADDED-->
<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding_IZad1Service" maxReceivedMessageSize="20000000"          maxBufferPoolSize="20000000">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" establishSecurityContext="false"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
    <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>
    <diagnostics>
      <messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true"
        logMessagesAtTransportLevel="true" />
    </diagnostics>
  </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>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add type="System.Diagnostics.DefaultTraceListener" name="Default">
            <filter type="" />
          </add>
          <add name="ServiceModelMessageLoggingListener">
            <filter type="" />
          </add>
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="c:\logs\web_messages.svclog"
          type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
          name="ServiceModelMessageLoggingListener" traceOutputOptions="Timestamp">
        <filter type="" />
      </add>
    </sharedListeners>
  </system.diagnostics>
</configuration>

Przepraszam za nazewnictwo.

3

Ok, czeka cię zadanie domowe - konfiguracja IIS ;)
Twój webservice nie odpala się obecnie w IIS, tylko w IIS Express. Tu możesz poczytać: https://msdn.microsoft.com/en-us/library/58wxa9w5.aspx
Zwróć szczególną uwagę na sekcję: Disadvantages of Using IIS as a Development Server with Visual Studio

Aby twoja usługa była dostępna na stałe, musisz ją uruchomić w IIS, które stale działa (IIS Express działa tylko wtedy, gdy odpalasz aplikację z VS).
Odpal sobie IIS Menager i zobacz - czy jest tam twoja aplikacja? Najpewniej nie. No to google'aj - "jak dodać aplikację do IIS" ;) (Zazwyczaj wystarczy wgrać pliki do katalogu c:\inetpub\wwwroot[nazwa_aplikacji])

I teraz uwaga. Jak już sobie skonfigurujesz u siebie, to fajnie - ale nie masz przecież gwarancji, że użytkownik końcowy w ogóle będzie miał IIS u siebie na komputerze, prawda? A nawet jeśli będzie miał, to przecież nie wiesz, na jakim porcie. Dlatego usługa powinna być wystawiona na jakiś zewnętrzny serwer. I wtedy w swojej aplikacji nie podajesz adresu do localhost, tylko do tego zewnętrznego serwera. I wtedy wszystko zawsze będzie działać.

0

Super, dzięki za rady. Po czym poznałaś, że to Express? Przyznam się bez bicia, że do standardowej konfiguracji dodałem tylko parę linijek, tak aby webservice zwracał mi sporą ilość danych. Zabiorę się zatem za konfigurację usługi na nowo. Aplikacja będzie działała tylko u mnie- dopiero się uczę, więc chciałbym zacząć od tego.

Jeszcze raz dzięki, dam znać jak mi poszło.

0

Po czym poznałaś, że to Express?

Pierwsza sugestia to dziwny port - IIS standardowo jest na porcie 80, jak już ktoś sobie konfiguruje inny, to zazwyczaj jednak coś w stylu 81 albo 8080. IIS Express losuje sobie z jakiegoś tam zakresu.
Druga sugestia jest tu: http://localhost:51158/Service1.svc
Jakbyś miał to na IIS, to w adresie byłaby jeszcze nazwa aplikacji.

0

Ok, dodałem aplikację do IIS, jednak otrzymuję następujący wyjątek w Viewmodelu podczas logowania:

The server was unable to process the request due to an internal error. For more information about the error, either turn on IncludeExceptionDetailInFaults (either from ServiceBehaviorAttribute or from the <serviceDebug> configuration behavior) on the server in order to send the exception information back to the client, or turn on tracing as per the Microsoft .NET Framework SDK documentation and inspect the server trace logs.

Oraz błąd

unable to step automatically into the server
gdy chcę "zajrzeć" do metody z serwisu.

Co mogę z tym zrobić? Może błąd jest gdzieś w web.config ? Jedyne co zostało zmienione to adres w api.config.

1

The server was unable to process the request due to an internal error.

Póki nie dowiesz się, jaki to internal error, to możemy tylko zgadywać. Jeśli zmieniłeś tylko adres w api.config, to zgaduję, że wpisałeś zły adres ;) Ale to tylko ślepy strzał, równie dobrze mogłeś źle skonfigurować webservice i może on po prostu nie działa?

Ten adres, który odpytujesz z aplikacji, wpisz w przeglądarkę. Co się pojawia? Działa dobrze, czy rzuca 500? Jeśli 500, to powinno ci podać również komunikat błędu. Dawaj ten komunikat.

Tu masz podane, jak odpytać webservice przez przeglądarkę: http://stackoverflow.com/questions/25314578/how-to-access-wcf-service-methods-from-browser
Ale jakbyś miał z tym problemy, to tym narzędziem możesz testować SOAP: http://www.soapui.org/

Dopiero jak potwierdzisz, że webservice działa ok, możesz przejść do sprawdzania, czy jego załączenie do projektu jest OK.

1

Ok, udało się wyciągnąć ten error. Trochę mnie niepokoi, ponieważ zwraca

Login failed for user
w String Connection w metodzie, gdzie używam sql adaptera (w web serwisie). Wydaję mi się, że muszę wskazać metodę autoryzacji (sql zamiast windows), bo w sql management mam zaznaczone obie i może tu wybiera zawsze windows.

Problem rozwiązany, jednak wkradł się błąd, który powodował autoryzacje windowsową, gdzie wywalało błąd. Teraz wszystko działa. Problem rozwiązany, temat do zamknięcia :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1