2013-04-04 12 views
7

Zanim się zgodzisz, wiem, że są tam zduplikowane pytania, takie jak ten, ale próbowałem i nie udało mi się znaleźć rozwiązania w im. Możliwe, że coś mi umknęło, ale wciąż jestem względnie nowy w WCF, więc część z nich trochę mi idzie na głowę.WCF - Wystąpił błąd podczas odbierania odpowiedzi HTTP na http: // xxxxx/Service/

Robię to wezwanie w moim usług WCF.

public User GetStudentRecord(string userName) 
    { 
     try 
     { 
      return new DashboardFacade().GetStudentRecord(userName); 
     } 
     catch (Exception ex) 
     { 
      ServiceFault fault = new ServiceFault(); 
      fault.Operation = "GetStudentRecord"; 
      fault.Reason = "Who knows..."; 
      fault.Message = ex.Message; 
      throw new FaultException<ServiceFault>(fault, fault.Message, new FaultCode(fault.Reason), fault.Operation); 
     } 
    } 

DashboardFacade() GetStudentRecord (..) jest zdefiniowana następująco:

public User GetStudentRecord(string userName) 
{ 
    User user = ctx.Users.Where(x => x.ADUserName == userName).SingleOrDefault(); 
    return user; 
} 

ctx jest mój DbContext. Używam Entity Framework Code First. Zadaniem użytkownika wygląda następująco:

public class User 
{ 
    public User() 
    { 
     //UserDetails = new UserDetail(); 
    } 
    [Key] 
    public Guid MasterKey { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public string ADUserName { get; set; } 
    public string UserType { get; set; } 
    public virtual UserDetail UserDetails { get; set; } 
    public Nullable<DateTime> LastModifiedDate { get; set; } 
} 

I wreszcie, prawdopodobnie trzeba zobaczyć na web.config aplikacji WCF:

<?xml version="1.0"?> 
    <configuration> 
     <connectionStrings> 
     <add name="NotMyDBContextDB" connectionString="[omitted]" providerName="System.Data.SqlClient"/> 
     <add name="ApplicationContext" connectionString="Data Source=.;Initial Catalog=MyApp;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient"/> 
     </connectionStrings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0"/> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
     </behaviors> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
<system.webServer> 
<modules runAllManagedModulesForAllRequests="true"/> 
<directoryBrowse enabled="true"/> 
</system.webServer> 
</configuration> 

Czy ktoś może wskazać mi gdzie wezwę niewłaściwy tutaj?

ta jest dokładna błąd otrzymuję:

An error occurred while receiving the HTTP response to http://localhost:5843/MyService.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. 

Inner Exception: 
The underlying connection was closed: An unexpected error occurred on a receive. 

Inner Exception: 
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. 

Inner Exception: 
An existing connection was forcibly closed by the remote host 
+0

Gdzie jest błąd wyrzucane? Uruchom usługę w debugerze. – dthorpe

+0

Po prostu dodałem komunikat o błędzie i wewnętrzne wiadomości wyjątku, które otrzymuję. Mogę uruchomić go w debugerze i pozwala mi przejść przez cały kod, który mam powyżej. Po opuszczeniu funkcji GetStudentRecord() w rzeczywistej usłudze pojawia się błąd kilka sekund później. – ledgeJumper

Odpowiedz

8

znalezieniu przyczyny po wielu przekleństw i myślenia jak miło pogoda jest na zewnątrz. Usuwam wirtualne słowo kluczowe z obiektu UserDetails znajdującego się w obiekcie użytkownika.

Teraz działa!

Jeśli chodzi o powód, dla którego to spowodowało problem, moje założenia to problemy z serializacją lub DbContext, ale będę musiał się w to zagłębić, nie jestem pewien.

Idę teraz na zewnątrz.

Więc dla odniesienia, jeśli likwidacji tutaj i nie mają pojęcia, co się dzieje, pośród wszystkich innych rzeczy należy zwracać na (wielkość, czas oczekiwania, etc):

Check to see if your object has virtual keyword on it. 
+0

Zajęło mi CAŁY DZIEŃ, abym znalazł tę odpowiedź. Dziękuję Ci! –

+0

Jesteś aniołem. Po prostu zmarnowałem na to cały dzień. Dziękuję za podpowiedź. – stakx

0

Czy Twój wyjątek zdarzyć podczas próby uzyskania dostępu pewne pole obiektu użytkownika, który jest zwracany?

Jeśli tak, to wydaje się, że twój obiekt ctx jest zamknięty przez twoją usługę po wywołaniu GetStudentRecord(). Gdzie tworzysz ctx i jak go otwierasz/zamykasz?

(Ze względu na wymóg 50 rep nie mogę umieścić to w komentarzu ... więc tutaj jako odpowiedź zamiast)

+0

Kontekst jest tworzony w klasie, w której znajduje się ta metoda. Jest w oddzielnej bibliotece klas niż sama usługa wcf. Tak więc, gdy klasa inicjuje, tworzony jest kontekst. Mam dwie inne metody w klasie DashboardFacade, które robią w zasadzie to samo, ale zwracają listę różnych obiektów, a nie obiektu użytkownika. Więc nie wiem, że byłby związany z kontekstem. – ledgeJumper

+0

Mam takie samo pytanie, jak _dthorpe_ powyżej: Skąd wyjątek jest odrzucany? Czy lądujesz w haczyku GetStudentRecord() lub czy wyjątek pochodzi z innego obszaru? – TomEddie

+0

Wyjątek był wyrzucany gdzie indziej, a nie w żaden kod, który oglądałem. Dzięki nim wszystkie metody, które napisałem powyżej, są w porządku. – ledgeJumper

0

żadna z metod pracował dla mnie. To co zrobiłem to debugowanie usługi podczas uruchamiania z klienta testowego WCF i udało mi się znaleźć mój problem. Miało to związek z biblioteką usług, która nie ma ciągu połączenia w pliku app.config.

Po prostu opublikowanie, jeśli ktoś próbował wszystkich innych metod i nadal nie może znaleźć problemu.

1

Miałem ten sam błąd.

W moim przypadku mam tabelę z int kolumną o nazwie OEM. W warstwie modelu mam klasę (DTO) z tą kolumną reprezentowaną przez Enum. W tabeli był wiersz, którego wartość w kolumnie OEM była nieprawidłowa. Kiedy próbowałem przenieść wszystkie dane za pomocą LINQ, wystąpił błąd, który nie został przechwycony przez VisualStudio. Ten błąd został zgłoszony, gdy WCF próbował pobrać wiadomość.

4

Miałem ten problem iw moim przypadku problem polegał na tym, że usługa WCF zwracała klasę, która posiadała własność tylko z geterem i bez setera. Próbowałem zapobiec modyfikacji właściwości przez odbiornik. Aby obejść ten problem, to zobaczyć ...

WCF Services and Object Constructors

+0

To mnie uratowało! Rzeczywisty błąd został spowodowany przez właściwość tylko do odczytu, która rzuciła zerowy wyjątek odwołania ... Ale to wszystko było ukryte głęboko. Szaleństwo WCF! – Schalk

Powiązane problemy