Może to być spowodowane tym, że powiązanie punktu końcowego usługi nie używa protokołu HTTP


87

Mam usługę WCF działającą poprawnie na moim komputerze lokalnym. Umieściłem go na serwerach i otrzymuję następujący błąd:

Wystąpił błąd podczas odbierania odpowiedzi HTTP na adres http: //xx.xx.x.xx: 8200 / Services / WCFClient.svc . Może to być spowodowane tym, że powiązanie punktu końcowego usługi nie używa protokołu HTTP. Może to być również spowodowane przerwaniem kontekstu żądania HTTP przez serwer (prawdopodobnie z powodu zamknięcia usługi). Zobacz dzienniki serwera, aby uzyskać więcej informacji.]

Poszedłem do usługi w url i działa poprawnie. Wszystko, co robię dla funkcji, to zwracanie ciągu do nazwy obrazu, więc przekazywanych danych nie jest dużo. Prześledziłem dziennik i daje mi te same informacje. Oto moja konfiguracja klienta:

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

Oto moja konfiguracja serwera:

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

Czy byłoby to ustawienie na serwerze, ponieważ działa na moim komputerze lokalnym?


Rozwiązałem swój problem, jak wyjaśniłem tutaj: stackoverflow.com/questions/5537794/…
Adi

Wygląda na to, że dotarłeś dalej niż ja. Może możesz mi podpowiedzieć, co mam dalej robić. stackoverflow.com/questions/16628382/…
Niels Brinch

Jest jakaś szansa, że ​​zaakceptujesz którąkolwiek z odpowiedzi, skoro wątpię, że wciąż na nią czekasz? :)
Noctis,

Odpowiedzi:


100

Myślę, że jest problem z serializacją, możesz znaleźć dokładny błąd, wystarczy dodać poniższy kod w konfiguracji usługi w <configuration>sekcji.

Po aktualizacji konfiguracji "App_tracelog.svclog"utworzy się plik, w którym istnieje Twoja usługa, wystarczy otworzyć .svclogplik i znaleźć czerwoną linię koloru na lewym panelu bocznym, co jest błędem i zobaczyć jego opis, aby uzyskać więcej informacji.

mam nadzieję, że pomoże to znaleźć błąd.

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>

4
To właściwie uratowało mi dzień. Rzeczywiście był to problem z serializacją i brakowało mi System.Runtime.Serializationźródła w moim śladzie.
julealgon

Fajnie ... nie byłam tego świadoma :)
Noctis

epicki! który zapisuje błąd, który nie był dostępny w żadnym wyjątku, w pliku
App_tracelog.svclog

Znakomity! Dzięki
SyntaxError

1
Pamiętaj, aby wkleić <system.diagnostics>sekcję na końcu pliku, tuż powyżej </configuration>. Jeśli wkleisz go u góry, możesz otrzymać błąd typu zawartości podczas uruchamiania aplikacji.
Tawab Wakil

75

Wystąpił ten problem „Może to być spowodowane tym, że powiązanie punktu końcowego usługi nie używa protokołu HTTP” i usługa WCF zostanie zamknięta (na komputerze deweloperskim)

Zorientowałem się: w moim przypadku problem dotyczył Enum,

Rozwiązałem za pomocą tego

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

Musiałem udekorować moje wyliczenia za pomocą DataContract, Flags i wszystkich członków wyliczenia z atrybutami EnumMember.

Rozwiązałem to po przejrzeniu tego odniesienia msdn :


1
Dziękuję Ci. To było dokładnie to, co musiałem zrobić.
Matthew Cole

1
Dzięki, właśnie zaoszczędziłeś mi mnóstwo czasu
nixon,

4
Dziękuję bardzo ... zaoszczędziłam dużo czasu
amesh,

Powiązane z tym - jeśli masz typ wyliczenia dla kontraktu, który nie jest typem DataMember, otrzymasz ten błąd. Po prostu dodałem właściwość, która była DataMember i nadałem jej typ wyliczeniowy inny niż DataContract.
paz

Czy nie jest tak, że wyliczenia muszą zaczynać się od indeksu 0? Z pewnością był to dla mnie problem w przeszłości. Tak więc w powyższym przykładzie APPLE = 0 zamiast 1.
Senator


14

W moim przypadku błąd został wygenerowany, ponieważ jeden z moich złożonych typów miał właściwość bez metody ustawiania.

Z tego powodu serializator zgłosił wyjątek. Dodano wewnętrzne metody zestawu i wszystko działało dobrze.

Najlepszym sposobem, aby dowiedzieć się, dlaczego tak się dzieje (moim zdaniem) jest włączenie rejestrowania śledzenia.

Osiągnąłem to, dodając następującą sekcję do mojego web.config:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

Po ustawieniu uruchomiłem klienta, dostałem wyjątek i sprawdziłem plik „Traces.svclog”. Stamtąd musiałem tylko znaleźć wyjątek.


autoflush = true było kluczem
Jeremy Smith

9

Rozwiązanie z DataContract, Flags for Enums wygląda trochę brzydko. W moim przypadku problem został rozwiązany poprzez dodanie do wyliczenia czegoś takiego jak „NotSet = 0”:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}

Ach tak, przepraszam, właśnie skomentowałem dalszą odpowiedź. Też widziałem to zachowanie.
Senator

wyjaśnienie: miałem ten sam problem. Odpowiedź @ Rikina doprowadziła mnie do: „Komunikat InnerException brzmiał 'Wartość wyliczenia' 0 'jest nieprawidłowa dla typu ...” z [ social.msdn.microsoft.com/Forums/vstudio/en-US/ ... Otrzymałem jem: „Problem polega na tym, że nie inicjalizujesz ..Response i pobiera ona domyślną (i nieprawidłową) wartość '0' ... więc nie można jej serializować”.
AJ AJ

3

Miałem do czynienia z tym samym problemem i rozwiązałem go za pomocą poniższego kodu. (jeśli występuje problem z łącznością TLS)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Wklej tę linię przed otwarciem kanału klienta.


1

Rozwiązałem problem. Skończyło się na tym, że ścieżka do mojego pliku konfiguracyjnego była nieprawidłowa. Błędy programu WCF są czasami bardzo pomocne.



1

Widziałem ten błąd spowodowany przez cykliczne odwołanie w grafie obiektu. Dołączenie wskaźnika do obiektu nadrzędnego od dziecka spowoduje zapętlenie serializatora i ostatecznie przekroczy maksymalny rozmiar komunikatu.


1

Ten błąd może wynikać z niedopasowania umowy. Rozważ trzy warstwy aplikacji poniżej ...

Warstwa interfejsu użytkownika
|
Warstwa procesowa
|
Warstwa dostępu do danych
-> Umowa między warstwą procesu a warstwą interfejsu użytkownika ma to samo wyliczenie z brakiem (Onhold = 3). Enum: Start = 1, Stop = 2. -> Kontrakt między warstwą dostępu do danych a procesem ma wyliczenie Wyliczenie: Start = 1, Stop = 2, Onhold = 3.

W takim przypadku otrzymamy ten sam błąd w odpowiedzi warstwy procesu.

Ten sam błąd pojawia się w przypadku niezgodności innych umów w aplikacji wielowarstwowej.


Twoja odpowiedź nie wydaje się mieć nic wspólnego z pytaniem. Zauważ również, że OP już rozwiązał swój problem - ścieżka do pliku konfiguracyjnego była błędna .
Simon MᶜKenzie

1

Miałem ten problem, ponieważ skonfigurowałem moją usługę WCF, aby zwracała System.Data.DataTable.

Działało dobrze na mojej testowej stronie HTML, ale wybuchło, gdy umieściłem to w mojej aplikacji Windows Form.

Musiałem wejść i zmienić podpis umowy operacyjnej usługi z DataTable na DataSet i odpowiednio zwrócić dane.

Jeśli masz ten problem, możesz dodać dodatkowy kontrakt operacyjny do swojej usługi, aby nie musiał się martwić o złamanie kodu, który opiera się na istniejących usługach.


1

Może to wynikać z wielu powodów; poniżej jest kilka z nich:

  1. Jeśli używasz złożonych obiektów kontraktu danych (co oznacza obiekt niestandardowy z większą liczbą niestandardowych obiektów podrzędnych), upewnij się, że wszystkie obiekty niestandardowe zostały ozdobione atrybutami DataContract i DataMember
  2. Jeśli obiekty kontraktu danych używają dziedziczenia, upewnij się, że wszystkie klasy bazowe mają atrybuty DataContract i DataMember. Ponadto klasy bazowe muszą określać klasy pochodne za pomocą atrybutu [KnownType (typeof (BaseClassType))] ( więcej informacji na ten temat można znaleźć tutaj ).

  3. Upewnij się, że wszystkie właściwości obiektu kontraktu danych mają zarówno właściwości Get, jak i Set.


1

Mój problem polegał na tym, że między klientem a serwerem było przesyłanych zbyt wiele elementów. Musiałem zmienić te ustawienia w zachowaniu po obu stronach.

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

Użyłem tego samego rozwiązania. Ale musiałem użyć Service Trace Viewer zgodnie z sugestią @ 100r, aby zobaczyć, że to błąd.
Björn

1

Może to nie mieć znaczenia dla konkretnego problemu, ale wspomniany komunikat o błędzie ma wiele przyczyn. Jedną z nich jest użycie typu zwracanego dla [OperationContract], który jest abstrakcyjny, interfejs lub nieznany w kodzie klienta WCF.

Sprawdź poniższy post (i rozwiązanie)

https://stackoverflow.com/a/5310951/74138


1

Myślę, że najlepszym sposobem rozwiązania tego problemu jest postępowanie zgodnie z poradami dotyczącymi błędów, stąd szukanie dzienników serwera. Aby włączyć logi, dodałem

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

Następnie przejdź do c: \ logs \ TracesServ_ce.svclog i otwórz go za pomocą przeglądarki śledzenia usługi Microsoft. I zobacz, w czym naprawdę jest problem.



1

Walczyłem z tym przez kilka dni i wypróbowałem każdą odpowiedź z tego postu i wielu innych i udostępniłem moje rozwiązanie, ponieważ objawy były takie same, ale problem był inny.

Problem polegał na tym, że pula aplikacji została skonfigurowana z ograniczeniem pamięci i po prostu została przywrócona po zmiennym czasie.

Mam nadzieję, że to pomoże komuś innemu!
Pozdrowienia,


1

Mój problem polegał na tym, że zwracany typ mojej usługi był ciągiem. Ale zwróciłem ciąg typu xml:

<reponse><state>1</state><message>Operation was successfull</message</response>

więc wyrzucono błąd.


1

w moim przypadku

moja usługa ma funkcję download Files

i ten błąd pojawiał się tylko podczas próby pobrania Big Files

więc znalazłem odpowiedź na Zwiększenie maxRequestLengthdo potrzebnej wartości wweb.config

Wiem, że to dziwne, ale problem rozwiązany

Jeśli nie wykonasz żadnych operacji przesyłania lub pobierania, może ta odpowiedź ci nie pomoże


1

Dla mnie rozwiązania tego błędu są bardzo dziwne. To była kwestia adresu portu EndpointAddress . W programie Visual Studio adres portu twojego pliku (np. Service1.svc) i adres portu twojego projektu wcf muszą być takie same, jakie podajesz w EndpointAddress . Opiszę szczegółowo to rozwiązanie.

Istnieją dwa kroki, aby sprawdzić adresy portów.

  1. W projekcie WCF kliknij prawym przyciskiem myszy plik usługi (np. Service1.svc) -> następnie wybierz Wyświetl w przeglądarce teraz w przeglądarce masz adres URL taki jak http: // localhost: 61122 / Service1.svc, więc teraz zanotuj swój adres portu jako a 61122

  2. Kliknij prawym przyciskiem myszy swój projekt wcf -> następnie wybierz Właściwości -> przejdź do zakładki Web -> Teraz w sekcji Serwery -> wybierz Użyj serwera programistycznego Visual Studio -> wybierz Określony port i podaj adres portu, który znaleźliśmy wcześniej w naszej Service1. usługa svc. To jest (61122) .

Wcześniej mam inny adres portu. Po prawidłowym określeniu adresu portu, który podałem w EndpointAddress , mój problem został rozwiązany.

Mam nadzieję, że może to rozwiązać Twój problem.


0

Miałem również ten problem i wynikał on z zapomnienia o udekorowaniu mojego modelu atrybutami DataContract i DataMember


0

Jeśli masz bazę danych (pracującą w Visual Studio) to upewnij się, że w tabelach nie ma kluczy obcych, miałem klucze obce i dał mi ten błąd i jak je usunąłem to działało sprawnie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.