Sử dụng dịch vụ dữ liệu WCF (và khung thực thể mới nhất), tôi muốn trả về dữ liệu từ một thủ tục được lưu trữ. Các trường sproc được trả về không khớp với bất kỳ thực thể nào trong db của tôi, vì vậy tôi tạo một kiểu phức hợp mới cho nó trong mô hình edmx (thay vì gắn một thực thể hiện có):Làm thế nào để tiêu thụ một đối tượng phức tạp từ một sproc bằng cách sử dụng dịch vụ dữ liệu WCF/OData?
- Nhấp chuột phải vào *. edmx mô hình/Add/Chức năng Import
- Chọn sproc (trả về ba lĩnh vực) - GetData
- Bấm Get Thông tin Cột
- Thêm Chức năng Import Name: GetData
- Bấm Tạo Kiểu Complex mới - GetData_Result
Trong dịch vụ, tôi xác định:
[WebGet]
public List<GetData_Result> GetDataSproc()
{
PrimaryDBContext context = new PrimaryDBContext();
return context.GetData().ToList();
}
Tôi tạo ra một giao diện điều khiển ứng dụng nhanh chóng để kiểm tra, và thêm một tham chiếu đến System.Data.Services
và System.Data.Services.Client
- điều này sau khi chạy Install-Package EntityFramework -Pre
, nhưng các phiên bản trên các thư viện là 4.0 và không 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();
}
}
}
Tôi không sử dụng số UriKind.Relative
hoặc bất kỳ điều gì khác để làm phức tạp điều này.
Khi tôi điều hướng trong trình duyệt đến URL, tôi thấy dữ liệu, nhưng khi tôi sử dụng nó trong ứng dụng bảng điều khiển của mình, tôi hoàn toàn không nhận được gì.
Thêm tracing để trộn:
<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>
... và mở cửa bằng cách sử dụng Microsoft Dịch vụ vết Viewer, tôi thấy hai cảnh báo idential: không tìm thấy
Cấu hình bối cảnh đánh giá.
<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>
Vì vậy, tại sao tôi lại có thể xem dữ liệu từ trình duyệt, nhưng không phải khi tiêu thụ trong ứng dụng của tôi?
- CẬP NHẬT -
Tôi đã tải về Microsoft WCF Data Services October 2011 CTP mà tiếp xúc DataServiceProtocolVersion.V3
, tạo ra một máy chủ mới và khách hàng và tham chiếu Microsoft.Data.Services.Client (v4.99.2.0). Bây giờ nhận được lỗi sau trên máy khách khi thử lặp lại trong vòng lặp foreach
:
Có loại không phù hợp giữa khách hàng và dịch vụ. Loại 'ConsoleApplication1.WcfDataServiceOctCTP1.GetDataSproc_Result' là loại thực thể , nhưng loại trong tải trọng phản hồi không đại diện cho loại thực thể. Vui lòng đảm bảo rằng các loại được xác định trên đối tượng khách hàng mô hình dữ liệu của dịch vụ hoặc cập nhật tham chiếu dịch vụ trên ứng dụng .
Tôi đã thử điều tương tự bằng cách tham chiếu thực thể thực tế - hoạt động tốt, cùng vấn đề.