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?

Matt Schubert
źródło
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>
Rikin Patel
źródło
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 :

Rajesh
źródło
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.

Stuart
źródło
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 
}
b1n0m
źródło
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.

Abdul Azeez
źródło
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.

Matt Schubert
źródło
1

Aby to naprawić, musieliśmy zmienić tożsamość puli aplikacji na konto administratora .

SarjanWebDev
źródło
To było dla mnie przydatne. Nie zrobiłem dokładnie tego, co sugerował Sarjan, ale po prostu nadałem uprawnienia do odczytu / zapisu w folderze aplikacji (pod wwwroot ...) tożsamości puli aplikacji, której używałem.
Francesco B.
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.

Mark Challen
źródło
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.

Abhijit Kumar
źródło
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.

jp2code
źródło
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.

Sujeewa
źródło
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"/>
Rob Sedgwick
źródło
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

trybeb
źródło
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.

Lomithrani
źródło
1

Aby uzyskać więcej informacji na temat tego problemu, zobacz również: istniejące połączenie zostało przymusowo zamknięte przez hosta zdalnego - WCF

Mój problem polegał na tym, że moje obiekty do przesyłania danych były zbyt złożone. Zacznij od prostych właściwości, takich jak, public long Id { get; set; }a kiedy już to zrobisz, zacznij dodawać dodatkowe rzeczy w razie potrzeby.

Serj Sagan
źródło
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,

Gonza Oviedo
źródło
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.

joettriscik
źródło
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

Basheer AL-MOMANI
źródło
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.

Dilip0165
źródło
0

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

Ian Rathbone
źródło
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

Laaiqah Seedat
źródło