2013-04-04 11 views
7

Prima del downvote, so che ci sono domande doppie come questa, ma ho provato e non sono riuscito a trovare una soluzione loro. Potrei essermi perso qualcosa, ma sono ancora relativamente nuovo a WCF, quindi un po 'mi passa un po' in testa.WCF - Si è verificato un errore durante la ricezione della risposta HTTP a http: // xxxxx/Service/

Sto facendo questa chiamata nel mio servizio 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 (..) è definita in questo modo:

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

CTX è il mio DbContext. Sto usando Entity Framework Code First. L'oggetto utente si presenta così:

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; } 
} 

E, infine, probabilmente avete bisogno di vedere web.config sull'applicazione 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> 

Qualcuno mi può puntare a dove sto andando male qui?

Questo è l'errore esatto sto ottenendo:

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

Dove è l'errore che sono gettati? Esegui il tuo servizio nel debugger. – dthorpe

+0

Ho appena aggiunto l'errore e i messaggi di eccezione interni che sto ottenendo. Posso eseguirlo nel debugger e mi permette di scorrere tutto il codice che ho sopra. Una volta che lascio la chiamata a GetStudentRecord() nel servizio effettivo, ottengo l'errore qualche secondo dopo. – ledgeJumper

risposta

8

trovato la causa principale dopo un sacco di imprecazioni e pensando che bello del il tempo è fuori Rimuovo la parola chiave virtuale dall'oggetto UserDetails che si trova all'interno dell'oggetto User.

Ora funziona!

Per quanto riguarda il motivo per cui questo ha causato un problema, le mie supposizioni sono problemi di serializzazione o DbContext, ma dovrò approfondire, non sono sicuro.

Ora vado fuori.

Così per riferimento, se si liquidazione qui e non hanno idea di cosa sta succedendo, tra tutte le altre cose che si dovrebbe guardare (dimensioni, timeout, ecc):

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

Mi è occorso un giorno intero per trovare questa risposta. Grazie! –

+0

Sei un angelo. Ho anche solo sprecato un giorno intero su questo. Grazie per il suggerimento. – stakx

0

Il vostro eccezione accade quando si tenta di accedere ad alcune campo dell'oggetto utente che viene restituito?

In tal caso, sembrerebbe che l'oggetto ctx venga chiuso dal servizio dopo la chiamata a GetStudentRecord(). Dove stai creando ctx e come lo stai aprendo/chiudendo?

(Dato l'obbligo 50 rep non ho potuto mettere questo in un commento ... quindi è qui come una risposta, invece)

+0

Il contesto viene creato nella classe in cui si trova il metodo. È in una libreria di classi separata rispetto al servizio wcf stesso. Quindi, quando la classe inizializza, viene creato il contesto. Ho altri due metodi nella classe DashboardFacade che stanno facendo praticamente la stessa cosa, ma restituendo un elenco di oggetti diversi, non l'oggetto User. Quindi non so che sarebbe contestualizzato. – ledgeJumper

+0

Ho la stessa domanda di _dthorpe_ sopra: da dove viene generata l'eccezione? Stai atterrando nella presa di GetStudentRecord() o l'eccezione proviene da un'altra area? – TomEddie

+0

L'eccezione veniva lanciata altrove, non in alcun codice che stavo guardando. Ha superato tutti i metodi che ho postato sopra bene. – ledgeJumper

0

Nessuno dei metodi ha funzionato per me Quello che ho fatto è stato eseguire il debug del servizio durante l'esecuzione dal client di test WCF e sono stato in grado di trovare il mio problema. Era a che fare con la libreria dei servizi che mancava la stringa di connessione in app.config.

Pubblicare solo se qualcuno ha provato tutti gli altri metodi e ancora non riesce a trovare il problema.

1

Ho avuto lo stesso errore.

Nel mio caso, ho una tabella con una colonna int denominata OEM. Nel livello del modello ho una classe (DTO) con quella colonna rappresentata da un Enum. Nella tabella c'era una riga il cui valore nella colonna OEM non era valido. Quando stavo cercando di portare tutti i dati usando LINQ, c'era un errore che non è stato catturato da VisualStudio. Questo errore si è verificato quando WCF ha tentato di recuperare il messaggio.

4

Ho avuto questo problema e nel mio caso, il problema era che il servizio WCF restituiva una classe che aveva una proprietà con solo un getter e nessun setter. Stavo cercando di impedire che la proprietà venga modificata dal ricevitore. Per aggirare il problema, vedere questo ...

WCF Services and Object Constructors

+0

Mi ha salvato! L'errore effettivo era causato da una proprietà di sola lettura che aveva lanciato un'eccezione di riferimento null ... Ma questo era tutto nascosto nel profondo. Follia WCF! – Schalk

Problemi correlati