2013-04-04 4 views
7

Bevor Sie einen Downvote durchführen, weiß ich, dass es doppelte Fragen wie diese gibt, aber ich habe versucht und es nicht geschafft, eine Lösung zu finden Sie. Könnte sein, dass ich etwas verpasst habe, aber ich bin immer noch relativ neu in der WCF, also geht mir einiges davon über den Kopf.WCF - Beim Empfangen der HTTP-Antwort ist ein Fehler aufgetreten. Http: // xxxxx/Service/

Ich mache diesen Aufruf in meinem WCF-Dienst.

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 (..) ist wie folgt definiert:

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

ctx mein DbContext ist. Ich verwende Entity Framework Code zuerst. Das User-Objekt sieht wie folgt aus:

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

Und schließlich müssen Sie wahrscheinlich die web.config auf der WCF-Anwendung sehen:

<?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> 

Kann jemand mir zeigen, wo ich falsch hier werde?

Dies ist die genauen Fehler Ich erhalte:

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

Wo ist der Fehler ausgelöst wird? Führen Sie Ihren Dienst im Debugger aus. – dthorpe

+0

Gerade hinzugefügt die Fehler und innere Ausnahme Nachrichten, die ich bekomme. Ich kann es im Debugger ausführen und es lässt mich durch den ganzen Code gehen, den ich oben habe. Sobald ich den Aufruf von GetStudentRecord() in dem tatsächlichen Dienst verlasse, erhalte ich den Fehler ein paar Sekunden später. – ledgeJumper

Antwort

8

gefunden, wie schön der Das Wetter ist draußen. Ich entferne das virtuelle Schlüsselwort vom UserDetails-Objekt, das sich im User-Objekt befindet.

Jetzt funktioniert es!

Soweit dies ein Problem verursacht, meine Annahmen sind Serialisierung oder DbContext Probleme, aber ich muss mehr in es schauen, nicht sicher.

Ich gehe jetzt nach draußen.

So als Referenz, wenn Sie gewickelt hier und haben keine Ahnung, was los ist, unter all den anderen Dingen, die Sie an (Größe, Timeout, etc.) aussehen sollte:

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

Ich brauchte einen ganzen Tag, um diese Antwort zu finden. Vielen Dank! –

+0

Sie sind ein Engel. Ich habe auch nur einen ganzen Tag damit verschwendet. Danke für den Hinweis. – stakx

0

Gibt es in Ihrer Ausnahme passieren, wenn Sie versuchen, etwas Bereich des User-Objekts zuzugreifen, die zurückgegeben wird?

Wenn ja, scheint Ihr ctx-Objekt nach dem Aufruf von GetStudentRecord() von Ihrem Dienst geschlossen zu werden. Wo erstellst du ctx und wie öffnest/schließt du es?

die Ursache nach vielen Fluchen und Denken (Aufgrund der 50 rep Anforderung kann ich dies nicht in einem Kommentar setzen ... es ist also hier als Antwort statt)

+0

Der Kontext wird in der Klasse erstellt, in der sich die Methode befindet. Es befindet sich in einer separaten Klassenbibliothek als der wcf-Dienst selbst. Wenn die Klasse initialisiert wird, wird der Kontext erstellt. Ich habe zwei andere Methoden in der DashboardFacade-Klasse, die im Grunde dasselbe tun, aber eine Liste von verschiedenen Objekten zurückgeben, nicht das User-Objekt. Also ich weiß nicht, dass es kontextbezogen wäre. – ledgeJumper

+0

Ich habe die gleiche Frage wie _dthorpe_ oben: Woher wird die Ausnahme geworfen? Bekommen Sie den Fang von GetStudentRecord() oder kommt die Ausnahme von einem anderen Bereich? – TomEddie

+0

Die Ausnahme wurde woanders geworfen, nicht in irgendeinem Code, den ich mir angesehen habe. Es hat alle oben genannten Methoden gut überstanden. – ledgeJumper

0

Keine der Methoden hat für mich gearbeitet. Was ich getan habe, war, den Dienst zu debuggen, während ich vom WCF Test Client ausging, und ich konnte mein Problem finden. Es hatte damit zu tun, dass in der Service-Bibliothek die Verbindungszeichenfolge in der app.config fehlte.

Einfach posten, wenn jemand alle anderen Methoden ausprobiert hat und das Problem immer noch nicht finden kann.

1

Ich hatte den gleichen Fehler.

In meinem Fall habe ich eine Tabelle mit einer int-Spalte namens OEM. In der Modellschicht habe ich eine Klasse (DTO) mit dieser Spalte durch eine Enum dargestellt. Es gab eine Zeile in der Tabelle, deren Wert in der OEM-Spalte nicht gültig war. Als ich versuchte, alle Daten mit LINQ zu übertragen, gab es einen Fehler, der von VisualStudio nicht erfasst wurde. Dieser Fehler wurde ausgelöst, als WCF versuchte, die Nachricht abzurufen.

4

Ich hatte dieses Problem und in meinem Fall war das Problem, dass der WCF-Dienst eine Klasse zurückgab, die eine Eigenschaft mit nur einem Getter und keinem Setter hatte. Ich habe versucht zu verhindern, dass die Eigenschaft vom Empfänger geändert wird. Um dies zu umgehen, finden Sie diese ...

WCF Services and Object Constructors

+0

Das hat mich gerettet! Der eigentliche Fehler wurde durch eine Read-Only-Eigenschaft verursacht, die eine Null-Referenz-Ausnahme ausgelöst hatte ... Aber das war alles tief verborgen. WCF-Wahnsinn! – Schalk

Verwandte Themen