2012-04-11 2 views
4

Ich versuche, einen Rest-JSON-Service mit der WCF-REST-Servicevorlage 40 und Entity-FrameWork zu erstellen.WCF-REST-Servicevorlage 40 und Entity Framework im JSON-Format, die leere Antwort zurückgibt

Wenn ich versuche regelmäßig Objekt zu erstellen und senden es funktioniert alles einwandfrei und ich zurück JSON-Antwort (GetEvent Methode)

Wenn ich versuche, Objekt zurückzugeben, die von Entity Framework im XML-Format namens funktioniert alles einwandfrei (GetEvent3 Methode)

aber wenn ich versuche Json Antwort von Objekt zurückzugeben, die von Entity Framework genannt wurde ich leere Antwort (GetEvent2 Methode)

Jede Idee, warum?

Dies ist mein Code:

[DataContract] 
public class Event 
{ 
    [DataMember] 
    public int ID { get; set; } 

    [DataType(DataType.Text)] 
    [Display(Name = "Event Name")] 
    [DataMember] 
    public string Name { get; set; } 

    [Display(Name = "Event StartTime")] 
    [DataMember] 
    public DateTime StartTime; 

    [Display(Name = "Event EndTime")] 
    [DataMember] 
    public DateTime EndTime; 
} 




[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "/GetEvent", ResponseFormat = WebMessageFormat.Json)] 
    Event GetEvent(); 

    [WebGet(UriTemplate = "/GetEvent2", ResponseFormat = WebMessageFormat.Json)] 
    Event GetEvent2(); 

    [WebGet(UriTemplate = "/GetEvent3", ResponseFormat = WebMessageFormat.Xml)] 
    Event GetEvent3(); 
} 



[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] 
public class Service1 : IService1 
{ 
    private readonly EventsDB _db = new EventsDB(); 

    // This method return good response in Json format 
    [WebGet(UriTemplate = "/GetEvent", ResponseFormat = WebMessageFormat.Json)] 
    public Event GetEvent() 
    { 
     return new Event 
     { 
      ID = 1, 
      Name = "A vs. B", 
      StartTime = new DateTime(2012, 4, 10, 18, 00, 00), 
      EndTime = new DateTime(2012, 4, 11, 18, 00, 00), 
     }; 
    } 

    // This method return no response 
    [WebGet(UriTemplate = "/GetEvent2", ResponseFormat = WebMessageFormat.Json)] 
    public Event GetEvent2() 
    { 
     Event e = _db.Events.ToList()[0]; 
     return e; 
    } 

    // This method return good response in XML format 
    [WebGet(UriTemplate = "/GetEvent3", ResponseFormat = WebMessageFormat.Xml)] 
    public Event GetEvent3() 
    { 
     Event e = _db.Events.ToList()[0]; 
     return e; 
    } 
} 

Web.Config

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 

    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
    </configSections> 

    <connectionStrings> 
    <add name="EventsDB" 
     connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=EventsDB" 
     providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 

    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
    </modules> 
    </system.webServer> 

    <system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
    <standardEndpoints> 
     <webHttpEndpoint> 
     <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="false" defaultOutgoingResponseFormat="Json"/> 
     </webHttpEndpoint> 
    </standardEndpoints> 
    <services> 
     <service name="WcfRestService3.Service1"> 
     <endpoint address="http://localhost:50235/service1" 
       binding="webHttpBinding" 
       contract="WcfRestService3.IService1" /> 
     </service> 
    </services> 
    </system.serviceModel> 

    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"> 
     <parameters> 
     <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" /> 
     </parameters> 
    </defaultConnectionFactory> 
    </entityFramework> 


</configuration> 
+0

Haben Sie versucht, die GetEvent2-Methode auf das zu debuggen, was aus Ihrer Datenbank abgerufen wurde, bevor sie zurückgegeben wird? Überprüfen Sie außerdem, ob Lazy Loading auf "True" gesetzt ist, und versuchen Sie, "Lazy Loading" auf "False" zu setzen, und laden Sie das Event-Objekt, da JSON-Datenvertrags-Serialisierung Entitätsrahmenobjekte nicht mit internen Sammlungen serialisiert. – Rajesh

+1

Weitere Informationen finden Sie hier: http://connect.microsoft.com/VisualStudio/feedback/details/354859/entity-framework-entitycollection-and-dataccontractjsonserializer (oder) http://social.msdn.microsoft.com/Forums/en -US/adodottentityframework/thread/9bff1c80-41e3-483a-8762-304efa630328 – Rajesh

+0

Hast du das jemals herausgefunden? Ich habe das gleiche Problem. – fuzz

Antwort

0

Haben Sie in Betracht gezogen, asp.net mvc für Ihre Ruhedienste zu verwenden? Es ist wirklich unkompliziert, sicher und schnell. Es ist die Art von Sache, die dein Leben mit Sicherheit verbessert. Ein Dienst wie der, den Sie hier einstellen, kann in etwa 20 Minuten mit nicht mehr als 10 Zeilen Code abgeschlossen sein. ich hoffe es hilft.

0

Vermissen Sie das [OperationContract] Attribut für GetEvent2 Methode? kann ich sehen, dass das Attribut in dem „Beispiel“ Abschnitt erwähnt wird @http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webgetattribute.responseformat%28v=vs.90%29.aspx

EDIT: Ihre GetEvent Methode auch hat ein [OperationContract] Attribut angewendet, und pro Ihre Beschreibung funktioniert es?

+0

Alles ist in Ordnung. In WCF 4 wird REST OperationContract nicht benötigt, wenn WebGet- oder WebInvoke-Attribute verwendet werden – Regfor