Włącz IncludeExceptionDetailInFaults (z ServiceBehaviorAttribute lub z zachowania konfiguracji <serviceDebug>) na serwerze


157

Mam usługę WCF, która działa doskonale i coś się zmieniło i nie wiem co.

Mam ten wyjątek:

System.ServiceModel.FaultException: serwer nie mógł przetworzyć żądania z powodu błędu wewnętrznego. Aby uzyskać więcej informacji o błędzie, włącz opcję IncludeExceptionDetailInFaults (z ServiceBehaviorAttribute lub z zachowania konfiguracji) na serwerze w celu wysłania informacji o wyjątku z powrotem do klienta lub włącz śledzenie zgodnie z dokumentacją zestawu Microsoft .NET Framework 3.0 SDK i sprawdź dzienniki śledzenia serwera.

Jest to mylące, ponieważ używam .NET 4.0.

Gdzie mam włączyć IncludeExceptionDetailInFaults? Walczę, żeby to znaleźć.

Odpowiedzi:


265

Zdefiniuj zachowanie w .configpliku:

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="debug">
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    ...
  </system.serviceModel>
</configuration>

Następnie zastosuj zachowanie do swojej usługi w następujący sposób:

<configuration>
  <system.serviceModel>
    ...
    <services>
      <service name="MyServiceName" behaviorConfiguration="debug" />
    </services>
  </system.serviceModel>
</configuration>

Możesz również ustawić to programowo. Zobacz to pytanie .


1
Cześć Otivel, w moim przypadku istnieją zagnieżdżone foldery zawierające różne witryny i usługi. Folder, w którym znajduje się moja usługa i otrzymuję błąd, znajduje się na trzecim stopniu zagnieżdżenia w stosunku do głównej aplikacji internetowej i dla każdej usługi mam dedykowany plik web.config. Zmieniam odpowiedni plik web.config odpowiednio, aby dodać <serviceDebug includeExceptionDetailInFaults = "true" />. Ale nadal otrzymuję błąd. Czy muszę zmienić cały plik web.config w całej aplikacji internetowej?
MaxRecursion

2
@AkshayKulkarni: Nie jestem pewien, nie mam doświadczenia w tej sprawie. Najpierw upewnij się, że Twoje usługi mają odniesienie do zachowania usługi (sprawdź odpowiedź gagogra ). Jeśli to nie rozwiąże problemu, zadaj pytanie na SO.
Otiel

1
@MatthewLock: Zaktualizowana odpowiedź. Sprawdź również <zachowanie> i <usługa>, jeśli potrzebujesz więcej informacji.
Otiel

1
Program Visual Studio informuje mnie, że serviceBehaviors nie może być bezpośrednim elementem podrzędnym systemu system.serviceModel. Skończyło się na odpowiedzi rich.okelly.
Andrewb

3
Uwaga: VS2013 umieszcza tag <serviceDebug> w domyślnym pliku Web.config z ustawioną wartością false. Jeśli nie zauważysz, jak ja nie, i dodam XML powyżej, najwyraźniej wygrywa to, co jest na końcu w pliku. Mam nadzieję, że komuś się to przyda.
Jeff,

63

Znajduje się w pliku app.config.

<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDebug includeExceptionDetailInFaults="true"/>

9
Nie ustawiaj atrybutu name <behavior> (jak w odpowiedzi @Otiel), jeśli chcesz, aby był stosowany do wszystkich twoich usług.
Pashec

47

Jeśli chcesz to zrobić za pomocą kodu, możesz dodać takie zachowanie:

serviceHost.Description.Behaviors.Remove(
    typeof(ServiceDebugBehavior));
serviceHost.Description.Behaviors.Add(
    new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });

Dodaj to do ServiceHostinstancji obiektu: Przykład:ServiceHost serviceHost = new ServiceHost(Program.serviceInstance);
Daniel Bonetti

28

Możesz również ustawić to w tagu [ServiceBehavior] powyżej deklaracji klasy, która dziedziczy interfejs

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class MyClass:IMyService
{
...
}

Immortal Blue ma rację, nie ujawniając szczegółów wyjątku w publicznie wydanej wersji, ale do celów testowych jest to przydatne narzędzie. Zawsze wyłączaj po puszczeniu.


Użyłem tego w aplikacji, która działa na zapleczu i nigdy nie będzie publicznie dostępna, więc działa idealnie
AlbatrossCafe

4

Otrzymałem również ten sam błąd, WCF działało poprawnie, gdy używałem go w środowisku deweloperskim z moimi poświadczeniami, ale gdy ktoś inny używał go w TEST, generował ten sam błąd. Zrobiłem wiele badań, a następnie zamiast wykonywać aktualizacje konfiguracji, obsłużyłem wyjątek w metodzie WCF za pomocą wyjątku błędu. Ponadto tożsamość programu WCF musi być ustawiona przy użyciu tych samych poświadczeń, które mają dostęp do bazy danych, ktoś mógł zmienić Twoje uprawnienia. Poniżej kod na to samo:

 [ServiceContract]
public interface IService1
{
    [OperationContract]
    [FaultContract(typeof(ServiceData))]
    ForDataset GetCCDBdata();

    [OperationContract]
    [FaultContract(typeof(ServiceData))]
    string GetCCDBdataasXMLstring();


    //[OperationContract]
    //string GetData(int value);

    //[OperationContract]
    //CompositeType GetDataUsingDataContract(CompositeType composite);

    // TODO: Add your service operations here
}

  [DataContract]
public class ServiceData
{
    [DataMember]
    public bool Result { get; set; }
    [DataMember]
    public string ErrorMessage { get; set; }
    [DataMember]
    public string ErrorDetails { get; set; }
}

w swoim service1.svc.cs możesz użyć tego w bloku catch:

 catch (Exception ex)
        {
            myServiceData.Result = false;
            myServiceData.ErrorMessage = "unforeseen error occured. Please try later.";
            myServiceData.ErrorDetails = ex.ToString();
            throw new FaultException<ServiceData>(myServiceData, ex.ToString());
        }

I użyj tego w aplikacji klienckiej, jak poniższy kod:

  ConsoleApplicationWCFClient.CCDB_HIG_service.ForDataset ds = obj.GetCCDBdata();

            string str = obj.GetCCDBdataasXMLstring();

        }

        catch (FaultException<ConsoleApplicationWCFClient.CCDB_HIG_service.ServiceData> Fex)
      {
          Console.WriteLine("ErrorMessage::" + Fex.Detail.ErrorMessage + Environment.NewLine);
          Console.WriteLine("ErrorDetails::" + Environment.NewLine + Fex.Detail.ErrorDetails);
          Console.ReadLine();
      }

Po prostu spróbuj tego, na pewno pomoże to uzyskać dokładny problem.


4
NIE powinieneś ujawniać podstawowych szczegółów wyjątku. Ogólnym celem oddzielenia wyjątków między klientem a serwerem oraz potrzeby stosowania tej flagi w ogóle jest zapobieganie udostępnianiu klientowi informacji o wyjątku. Złośliwy użytkownik może wykorzystać te informacje do manipulowania Twoją usługą! Jeśli tworzysz, użyj zachowania IncludeExceptionDetailInFaults zgodnie z opisem, aby propagować cały wyjątek, lub we wdrożeniu zgłoś wyjątek błędu, podając bardzo podstawowy błąd, taki jak „Nie można zapisać pliku” zamiast podawania śladu stosu i pełnych szczegółów wyjątek.
Immortal Blue

Cześć ... w moim przypadku wszystkie inne funkcje serwisowe są wywoływane przez funkcję, której używam do zapisywania pliku, rzuca ten wyjątek ... aby poznać dokładny problem, w którym użyłem systemu logowania, ale nie jest tworzony dziennik dla tej metody ... Tworzę 3 dzienniki 1), gdy usługa trafiła 2) przed zapisaniem dowolnego pliku i 3) dziennik wyjątków.
user3217843

0

Jak podano w informacjach o błędzie, spróbuj zwiększyć wartość limitu czasu po stronie klienta i po stronie usługi w następujący sposób:

<basicHttpBinding>
    <binding name="basicHttpBinding_ACRMS" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647"
      openTimeout="00:20:00" 
      receiveTimeout="00:20:00" closeTimeout="00:20:00"
      sendTimeout="00:20:00">
      <readerQuotas maxDepth="32" maxStringContentLength="2097152"
        maxArrayLength="2097152" maxBytesPerRead="4006" maxNameTableCharCount="16384" />
    </binding>

Następnie nie zapomnij zastosować tej konfiguracji powiązania do punktu końcowego, wykonując następujące czynności:

<endpoint address="" binding="basicHttpBinding" 
      bindingConfiguration="basicHttpBinding_ACRMS"
      contract="MonitorRAM.IService1" />

Jeśli powyższe nie pomoże, lepiej będzie, jeśli spróbujesz wrzucić tutaj swój główny projekt, to chcę mieć test po mojej stronie.

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.