cze
18
2012

Problemy z WCF i diagnozowanie za pomocą MS Service Trace Viewer

Usługi WCF są generalnie fajne w użyciu ale mają tę wadę, że jak coś nie działa to często nie wiadomo o co chodzi. Niekiedy komunikaty o błędach potrafią być mało tego że niezbyt pomocne to jeszcze wprowadzać w błąd. Na tego typu komunikat natrafiłem dzisiaj, podczas próby wywołania mojej usługi. Podczas próby wywołanie tejże poleciał taki oto błąd:

An error occurred while receiving the HTTP response to http://xx.xx.x.xx:8200/Services/WCFClient.svc. This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.]

Oczywiście, po zobaczeniu takiego komunikatu zacząłem sprawdzać bindingi i konfigurację ale to na nic - niby po stronie klienta i usługi było wszystko tak jak trzeba ale błąd leciał. Po długim przeszukiwaniu google znalazłem w końcu na StackOverflow wątek: http://stackoverflow.com/questions/5870958/wcf-this-could-be-due-to-the-service-endpoint-binding-not-using-the-http-protoco. Druga odpowiedź wiodła na stronę Microsoftu: http://msdn.microsoft.com/en-us/library/ms732023.aspx. Opisuje ona sposób włączenia śledzenia w konfiguracji usługi oraz przeglądania wygenerowanych logów. W skrócie: należy w pliku konfiguracyjnym usługi dodać sekcję:

<system.diagnostics>
		<trace autoflush="true" />
		<sources>
			<source name="System.ServiceModel"
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
				<listeners>
					<add name="sdt"
						type="System.Diagnostics.XmlWriterTraceListener"
						initializeData= "SdrConfigExample.e2e" />
				</listeners>
			</source>
		</sources>
	</system.diagnostics>

Następnie spróbować wywołać usługę (żeby odłożył się błąd w logu). Kolejnym krokiem jest uruchomienie MS Service Trace Viewer (uruchamiamy linię komend Visual Studio i wpisujemy SvcTraceViewer.exe). Po uruchomieniu programu otwieramy plik z logiem (odkłada się w katalogu \bin usługi). Po otworzeniu pliku widzimy wszystkie czynności związane z działaniem usługi. Kolorem czerwonym zaznaczone są czynności podczas których poleciał błąd/wyjątek. W moim przypadku od razu mogłem zauważyć co powodowało problemy - ładnie odłożony był wyjątek:

There was an error while trying to serialize parameter Vsoft.pl/VU/Services:AddCompositeResult. The InnerException message was 'Enum value 'OK' is invalid for type 'VSoft.VU.Services.OperationResultType' and cannot be serialized. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.'.  Please see InnerException for more details.

Widząc to od razu wiedziałem co się stało - nie oatrybutowałem enuma używanego w DataContrakcie. Poprawa tego zajęła mi 5 min i wszystko zaczęło śmigać. Tak więc polecam używanie tego narzędzia w jakichkolwiek trudnych do wyjaśnienia problemach z WCF-ami.