Mit WCF Data Services (und dem neuesten Entity Framework) möchte ich Daten aus einer gespeicherten Prozedur zurückgeben. Die zurück sproc Felder passen nicht 1: 1 jede Einheit in meinem db, so dass ich erstellen Sie einen neuen komplexen Typen für sie im edmx Modell (statt eine bestehende Einheit befestigen):Wie kann ein komplexes Objekt von einem Sproc mit WCF Data Services/OData konsumiert werden?
- Rechtsklick auf den *. edmx Modell/Add/Funktion Import
- die sproc Wählen Sie (gibt drei Felder) - GetData
- Klicken Sie auf Spalteninformationen Erhalten
- Fügen Sie die Funktion Import Name: GetData
- Klicken Sie auf erstellen neuer komplexer Typ - GetData_Result
Im Dienst definiere ich:
[WebGet]
public List<GetData_Result> GetDataSproc()
{
PrimaryDBContext context = new PrimaryDBContext();
return context.GetData().ToList();
}
ich eine schnelle Konsolenanwendung erstellt, um zu testen, und fügte einen Verweis auf System.Data.Services
und System.Data.Services.Client
- dieser nach Install-Package EntityFramework -Pre
, aber die Versionen auf den Bibliotheken sind 4.0 und nicht aktiv 5.x.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Services.Client;
using ConsoleApplication1.PrimaryDBService;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataServiceContext context = new DataServiceContext(new Uri("http://localhost:50100/PrimaryDataService1.svc/"));
IEnumerable<GetData_Result> result = context.Execute<GetData_Result>(new Uri("http://localhost:50100/PrimaryDataService1.svc/GetDataSproc"));
foreach (GetData_Result w in result)
{
Console.WriteLine(w.ID + "\t" + w.WHO_TYPE_NAME + "\t" + w.CREATED_DATE);
}
Console.Read();
}
}
}
Ich habe nicht verwenden, um die UriKind.Relative
oder irgendetwas anderes, dies zu erschweren.
Wenn ich im Browser zur URL navigiere, sehe ich Daten, aber wenn ich es in meiner Konsolen-App konsumiere, bekomme ich gar nichts.
Hinzufügen der Mischung Tracing:
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
<listeners>
<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\temp\WebWCFDataService.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
... und die Öffnung mit dem Microsoft Service Trace Viewer, ich sehe zwei idential Warnungen:
Konfiguration Auswertung Kontext nicht gefunden.
<E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
<System xmlns="http://schemas.microsoft.com/2004/06/windows/eventlog/system">
<EventID>524312</EventID>
<Type>3</Type>
<SubType Name="Warning">0</SubType>
<Level>4</Level>
<TimeCreated SystemTime="2012-04-03T14:50:11.8355955Z" />
<Source Name="System.ServiceModel" />
<Correlation ActivityID="{66f1a241-2613-43dd-be0c-341149e37d30}" />
<Execution ProcessName="WebDev.WebServer40" ProcessID="5176" ThreadID="10" />
<Channel />
<Computer>MyComputer</Computer>
</System>
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Warning">
<TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.EvaluationContextNotFound.aspx</TraceIdentifier>
<Description>Configuration evaluation context not found.</Description>
<AppDomain>fd28c9cc-1-129779382115645955</AppDomain>
</TraceRecord>
</DataItem>
</TraceData>
</ApplicationData>
</E2ETraceEvent>
Warum bin ich in der Lage Daten aus dem Browser zu sehen, aber nicht, wenn sie in meiner app verbraucht?
- UPDATE -
Ich habe die Microsoft WCF Data Services October 2011 CTP die DataServiceProtocolVersion.V3
ausgesetzt, erstellt (v4.99.2.0) einen neuen Host und Client und verwiesen Microsoft.Data.Services.Client. Nun erhalte die folgenden Fehler auf dem Client, wenn Iterierte in der foreach
Schleife versucht:
Es ist eine Art Nichtübereinstimmung zwischen dem Client und dem Dienst. Typ 'ConsoleApplication1.WcfDataServiceOctCTP1.GetDataSproc_Result' ist ein Entitätstyp, aber der Typ in der Antwortnutzlast repräsentiert nicht einen Entitätstyp. Stellen Sie sicher, dass die auf dem Client definierten Typen dem Datenmodell des Service entsprechen, oder aktualisieren Sie die Service-Referenz auf dem -Client.
Ich versuchte das gleiche durch Bezugnahme auf die tatsächliche Einheit - funktioniert gut, so das gleiche Problem.