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?
źródło
Odpowiedzi:
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ć.svclog
plik 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>
źródło
System.Runtime.Serialization
źródła w moim śladzie.<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.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 :
źródło
Wystąpił ten sam błąd, a problemem była serializacja. Udało mi się znaleźć prawdziwy problem za pomocą Service Trace Viewer http://msdn.microsoft.com/en-us/library/ms732023.aspx i łatwo go rozwiązać. Może to komuś pomoże.
źródło
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.
źródło
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 }
źródło
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.
źródło
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.
źródło
Aby to naprawić, musieliśmy zmienić tożsamość puli aplikacji na konto administratora .
źródło
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.
źródło
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.
źródło
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.
źródło
Może to wynikać z wielu powodów; poniżej jest kilka z nich:
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 ).
Upewnij się, że wszystkie właściwości obiektu kontraktu danych mają zarówno właściwości Get, jak i Set.
źródło
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"/>
źródło
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
źródło
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.
źródło
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.źródło
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,
źródło
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.
źródło
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
maxRequestLength
do 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
źródło
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.
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
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.
źródło
Miałem również ten problem i wynikał on z zapomnienia o udekorowaniu mojego modelu atrybutami DataContract i DataMember
źródło
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
źródło