Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
WCF Veri Hizmetleri, temsili durum aktarımının (REST) semantiğini kullanarak Web veya intranet üzerinden verileri kullanıma açmak ve kullanmak için Açık Veri Protokolü'ne (OData) sahip hizmetler oluşturmanıza olanak tanıyan bir .NET Framework bileşenidir. OData, verileri URI'ler tarafından ele alınabilen kaynaklar olarak kullanıma sunar. Herhangi bir uygulama, bir HTTP isteği gönderebiliyorsa ve bir veri hizmetinin döndürdüğü OData akışını işleyebiliyorsa OData tabanlı bir veri hizmetiyle etkileşimde bulunabilir. Buna ek olarak, WCF Veri Hizmetleri .NET Framework uygulamalarından OData akışlarını kullanırken daha zengin bir programlama deneyimi sağlayan istemci kitaplıkları içerir. Bu konu, istemci kitaplıklarını kullanarak ve kullanmadan bir iş akışında OData akışı kullanmaya genel bir bakış sağlar.
Örnek Northwind OData hizmetini kullanma
Bu konudaki örneklerde konumundaki https://services.odata.org/Northwind/Northwind.svc/örnek Northwind veri hizmeti kullanılır. Bu hizmet, OData SDK'sının bir parçası olarak sağlanır ve örnek Northwind veritabanına salt okunur erişim sağlar. Yazma erişimi isteniyorsa veya yerel bir WCF Veri Hizmeti isteniyorsa, Northwind veritabanına erişim sağlayan yerel bir OData hizmeti oluşturmak için WCF Veri Hizmetleri Hızlı Başlangıç adımlarını izleyebilirsiniz. Hızlı başlangıcı izlerseniz, bu konudaki örnek kodda sağlanan yerel URI'yi değiştirin.
İstemci kitaplıklarını kullanarak OData akışı kullanma
WCF Veri Hizmetleri, .NET Framework ve istemci uygulamalarından bir OData akışını daha kolay kullanmanıza olanak tanıyan istemci kitaplıkları içerir. Bu kitaplıklar HTTP iletileri göndermeyi ve almayı basitleştirir. Ayrıca ileti yükünü varlık verilerini temsil eden CLR nesnelerine çevirir. İstemci kitaplıkları iki çekirdek sınıfını DataServiceContext ve DataServiceQuery<TElement>özelliklerini alır. Bu sınıflar bir veri hizmetini sorgulamanıza ve ardından döndürülen varlık verileriyle CLR nesneleri olarak çalışmanıza olanak tanır. Bu bölüm, istemci kitaplıklarını kullanan etkinlikler oluşturmaya yönelik iki yaklaşımı kapsar.
WCF Veri hizmetine hizmet başvurusu ekleme
Northwind istemci kitaplıklarını oluşturmak için, Visual Studio 2012'deki Hizmet Başvurusu Ekle iletişim kutusunu kullanarak Northwind OData hizmetine bir başvuru ekleyebilirsiniz.
Hizmet tarafından kullanıma sunulan hizmet işlemi olmadığını ve Hizmetler listesinde Northwind veri hizmeti tarafından kullanıma sunulan varlıkları temsil eden öğeler olduğunu unutmayın. Hizmet başvurusu eklendiğinde, bu varlıklar için sınıflar oluşturulur ve istemci kodunda kullanılabilirler. Bu konudaki örneklerde sorguları gerçekleştirmek için bu sınıflar ve NorthwindEntities sınıfı kullanılır.
Not
Daha fazla bilgi için bkz. Veri Hizmeti İstemci Kitaplığı Oluşturma (WCF Veri Hizmetleri).
Zaman uyumsuz yöntemler kullanma
Web üzerinden kaynaklara erişirken oluşabilecek olası gecikme sorunlarını gidermek için WCF Veri Hizmetleri zaman uyumsuz olarak erişmenizi öneririz. WCF Veri Hizmetleri istemci kitaplıkları sorguları çağırmak için zaman uyumsuz yöntemler içerir ve Windows Workflow Foundation (WF) zaman uyumsuz etkinlikler yazmak için sınıfı sağlarAsyncCodeActivity. AsyncCodeActivity türetilmiş etkinlikler, zaman uyumsuz yöntemleri olan .NET Framework sınıflarından yararlanmak için yazılabilir veya zaman uyumsuz olarak yürütülecek kod bir yönteme konulabilir ve temsilci kullanılarak çağrılabilir. Bu bölümde türetilmiş bir AsyncCodeActivity etkinliğin iki örneği verilmiştir: biri WCF Veri Hizmetleri istemci kitaplıklarının zaman uyumsuz yöntemlerini ve diğeri temsilci kullanan bir etkinliktir.
Not
Daha fazla bilgi için bkz. Zaman Uyumsuz İşlemler (WCF Veri Hizmetleri) ve Zaman Uyumsuz Etkinlikler Oluşturma.
İstemci kitaplığı zaman uyumsuz yöntemlerini kullanma
sınıfı, DataServiceQuery<TElement> bir OData hizmetini zaman uyumsuz olarak sorgulamak için ve BeginExecute yöntemleri sağlarEndExecute. Bu yöntemler, türetilmiş bir BeginExecute sınıfın EndExecute ve AsyncCodeActivity geçersiz kılmalarından çağrılabilir. AsyncCodeActivity BeginExecute Geçersiz kılma döndürdüğünde iş akışı boşta olabilir (ancak kalıcı olmaz) ve zaman uyumsuz çalışma tamamlandığında çalışma EndExecute zamanı tarafından çağrılır.
Aşağıdaki örnekte, iki giriş bağımsız değişkeni olan bir OrdersByCustomer etkinlik tanımlanmıştır.
CustomerId bağımsız değişkeni, döndürülecek siparişleri tanımlayan müşteriyiServiceUri, bağımsız değişken ise sorgulanacak OData hizmetinin URI'sini temsil eder. Etkinlik oradan AsyncCodeActivity<IEnumerable<Order>> türetildiğinden, sorgunun sonuçlarını döndürmek için kullanılan bir Result çıkış bağımsız değişkeni de vardır. Geçersiz kılma, BeginExecute belirtilen müşterinin tüm siparişlerini seçen bir LINQ sorgusu oluşturur. Bu sorgu geçirilen UserStateolarak belirtilir AsyncCodeActivityContext ve sorgunun BeginExecute yöntemi çağrılır. Sorguya BeginExecute geçirilen geri çağırma ve durumun etkinliğin BeginExecute yöntemine geçirilenler olduğunu unutmayın. Sorgunun yürütülmesi tamamlandığında etkinliğin EndExecute yöntemi çağrılır. Sorgu, içinden UserStatealınır ve sorgunun EndExecute yöntemi çağrılır. Bu yöntem belirtilen varlık türünden bir IEnumerable<T> döndürür; bu örnekte Order.
IEnumerable<Order> genel türü AsyncCodeActivity<TResult>olduğundan, bu IEnumerable etkinlik olarak ResultOutArgument<T> ayarlanır.
class OrdersByCustomer : AsyncCodeActivity<IEnumerable<Order>>
{
[RequiredArgument]
public InArgument<string> CustomerId { get; set; }
[RequiredArgument]
public InArgument<string> ServiceUri { get; set; }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
NorthwindEntities dataContext = new NorthwindEntities(new Uri(ServiceUri.Get(context)));
// Define a LINQ query that returns Orders and
// Order_Details for a specific customer.
DataServiceQuery<Order> ordersQuery = (DataServiceQuery<Order>)
from o in dataContext.Orders.Expand("Order_Details")
where o.Customer.CustomerID == CustomerId.Get(context)
select o;
// Specify the query as the UserState for the AsyncCodeActivityContext
context.UserState = ordersQuery;
// The callback and state used here are the ones passed into
// the BeginExecute of this activity.
return ordersQuery.BeginExecute(callback, state);
}
protected override IEnumerable<Order> EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
// Get the DataServiceQuery from the context.UserState
DataServiceQuery<Order> ordersQuery = context.UserState as DataServiceQuery<Order>;
// Return an IEnumerable of the query results.
return ordersQuery.EndExecute(result);
}
}
Aşağıdaki örnekte etkinlik, OrdersByCustomer belirtilen müşteri için siparişlerin listesini alır ve ardından bir ForEach<T> etkinlik döndürülen siparişleri numaralandırır ve her siparişin tarihini konsola yazar.
Variable<IEnumerable<Order>> orders = new Variable<IEnumerable<Order>>();
DelegateInArgument<Order> order = new DelegateInArgument<Order>();
Activity wf = new Sequence
{
Variables = { orders },
Activities =
{
new WriteLine
{
Text = "Calling WCF Data Service..."
},
new OrdersByCustomer
{
ServiceUri = "http://services.odata.org/Northwind/Northwind.svc/",
CustomerId = "ALFKI",
Result = orders
},
new ForEach<Order>
{
Values = orders,
Body = new ActivityAction<Order>
{
Argument = order,
Handler = new WriteLine
{
Text = new InArgument<string>((env) => string.Format("{0:d}", order.Get(env).OrderDate))
}
}
}
}
};
WorkflowInvoker.Invoke(wf);
Bu iş akışı çağrıldığında konsola aşağıdaki veriler yazılır:
Calling WCF Data Service...
8/25/1997
10/3/1997
10/13/1997
1/15/1998
3/16/1998
4/9/1998
Not
OData sunucusuna bağlantı kurulamıyorsa aşağıdaki özel duruma benzer bir özel durum alırsınız:
İşlenmeyen Özel Durum: System.InvalidOperationException: Bu istek işlenirken bir hata oluştu. >--- System.Net.WebException: System.Net.Sockets.SocketException ---> uzak sunucuya bağlanılamıyor: Bağlı taraf belirli bir süre sonra düzgün yanıt vermediğinden veya bağlı ana bilgisayar yanıt vermediğinden bağlantı kurulamadığından bağlantı girişimi başarısız oldu.
Sorgu tarafından döndürülen verilerin herhangi bir ek işlemesi gerekiyorsa, etkinliğin EndExecute geçersiz kılmasında yapılabilir. hem hem BeginExecute de EndExecute iş akışı iş parçacığı kullanılarak çağrılır ve bu geçersiz kılmalardaki kodlar zaman uyumsuz olarak çalışmaz. Ek işleme kapsamlı veya uzun süre çalışıyorsa veya sorgu sonuçları sayfalandırılmışsa, sorguyu yürütmek ve zaman uyumsuz olarak ek işlem gerçekleştirmek için bir temsilci kullanan bir sonraki bölümde ele alınan yaklaşımı göz önünde bulundurmanız gerekir.
Temsilci kullanma
Bir .NET Framework sınıfının zaman uyumsuz yöntemini çağırmaya ek olarak, tabanlı bir AsyncCodeActivityetkinlik de yöntemlerinden birinde zaman uyumsuz mantığı tanımlayabilir. Bu yöntem, etkinliğin BeginExecute geçersiz kılmasında bir temsilci kullanılarak belirtilir. Yöntemi döndürdüğünde çalışma zamanı etkinliğin EndExecute geçersiz kılmasını çağırır. bir iş akışından OData hizmetini çağırırken, bu yöntem hizmeti sorgulamak ve ek işlemler sağlamak için kullanılabilir.
Aşağıdaki örnekte bir ListCustomers etkinlik tanımlanmıştır. Bu etkinlik örnek Northwind veri hizmetini sorgular ve Northwind veritabanındaki tüm müşterileri içeren bir List<Customer> döndürür. Zaman uyumsuz iş yöntemi tarafından GetCustomers gerçekleştirilir. Bu yöntem tüm müşteriler için hizmeti sorgular ve sonra bunları içine List<Customer>kopyalar. Ardından sonuçların sayfalanmış olup olmadığını denetler. Bu durumda, hizmeti sonraki sonuç sayfası için sorgular, listeye ekler ve tüm müşteri verileri alınana kadar devam eder.
Not
WCF Veri Hizmetleri'da sayfalama hakkında daha fazla bilgi için bkz. Nasıl yapılır: Sayfalanmış Sonuçları Yükleme (WCF Veri Hizmetleri).
Tüm müşteriler eklendikten sonra liste döndürülür.
GetCustomers yöntemi etkinliğin BeginExecute geçersiz kılmasında belirtilir. Yöntemin dönüş değeri olduğundan, yöntemini belirtmek için bir Func<string, List<Customer>> oluşturulur.
Not
Zaman uyumsuz çalışmayı gerçekleştiren yöntemin dönüş değeri yoksa, yerine bir ActionFunc<TResult>kullanılır. Her iki yaklaşımı kullanarak zaman uyumsuz örnek oluşturma örnekleri için bkz . Zaman Uyumsuz Etkinlikler Oluşturma.
Bu Func<TResult> , öğesine UserStateatanır ve çağrılır BeginInvoke . Çağrılacak yöntemin etkinliğin bağımsız değişken ortamına erişimi olmadığından, bağımsız değişkenin ServiceUri değeri, içine BeginExecutegeçirilen geri çağırma ve durumla birlikte ilk parametre olarak geçirilir. Döndürdüğünde GetCustomers , çalışma zamanı öğesini çağırır EndExecute. içindeki EndExecute kod, temsilcisini UserState, çağrısından EndInvokealır ve yönteminden GetCustomers döndürülen müşterilerin listesi olan sonucu döndürür.
class ListCustomers : AsyncCodeActivity<List<Customer>>
{
[RequiredArgument]
public InArgument<string> ServiceUri { get; set; }
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
// Create a delegate that references the method that implements
// the asynchronous work. Assign the delegate to the UserState,
// invoke the delegate, and return the resulting IAsyncResult.
Func<string, List<Customer>> GetCustomersDelegate = new Func<string, List<Customer>>(GetCustomers);
context.UserState = GetCustomersDelegate;
return GetCustomersDelegate.BeginInvoke(ServiceUri.Get(context), callback, state);
}
protected override List<Customer> EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
{
// Get the delegate from the UserState and call EndInvoke
Func<string, List<Customer>> GetCustomersDelegate = (Func<string, List<Customer>>)context.UserState;
return (List<Customer>)GetCustomersDelegate.EndInvoke(result);
}
List<Customer> GetCustomers(string serviceUri)
{
// Get all customers here and add them to a list. This method doesn't have access to the
// activity's environment of arguments, so the Service Uri is passed in.
// Create the DataServiceContext using the service URI.
NorthwindEntities context = new NorthwindEntities(new Uri(serviceUri));
// Return all customers.
QueryOperationResponse<Customer> response =
context.Customers.Execute() as QueryOperationResponse<Customer>;
// Add them to the list.
List<Customer> customers = new List<Customer>(response);
// Is this the complete list or are the results paged?
DataServiceQueryContinuation<Customer> token;
while ((token = response.GetContinuation()) != null)
{
// Load the next page of results.
response = context.Execute<Customer>(token) as QueryOperationResponse<Customer>;
// Add the next page of customers to the list.
customers.AddRange(response);
}
// Return the list of customers
return customers;
}
}
Aşağıdaki örnekte etkinlik, ListCustomers müşterilerin listesini alır ve ardından bir ForEach<T> etkinlik bunları numaralandırır ve her müşterinin şirket adını ve kişi adını konsola yazar.
Variable<List<Customer>> customers = new Variable<List<Customer>>();
DelegateInArgument<Customer> customer = new DelegateInArgument<Customer>();
Activity wf = new Sequence
{
Variables = { customers },
Activities =
{
new WriteLine
{
Text = "Calling WCF Data Service..."
},
new ListCustomers
{
ServiceUri = "http://services.odata.org/Northwind/Northwind.svc/",
Result = customers
},
new ForEach<Customer>
{
Values = customers,
Body = new ActivityAction<Customer>
{
Argument = customer,
Handler = new WriteLine
{
Text = new InArgument<string>((env) => string.Format("{0}, Contact: {1}",
customer.Get(env).CompanyName, customer.Get(env).ContactName))
}
}
}
}
};
WorkflowInvoker.Invoke(wf);
Bu iş akışı çağrıldığında konsola aşağıdaki veriler yazılır. Bu sorgu birçok müşteri döndürdüğünden çıkışın yalnızca bir bölümü burada görüntülenir.
Calling WCF Data Service...
Alfreds Futterkiste, Contact: Maria Anders
Ana Trujillo Emparedados y helados, Contact: Ana Trujillo
Antonio Moreno Taquería, Contact: Antonio Moreno
Around the Horn, Contact: Thomas Hardy
Berglunds snabbköp, Contact: Christina Berglund
...
İstemci kitaplıklarını kullanmadan OData akışı kullanma
OData, verileri URI'ler tarafından ele alınabilen kaynaklar olarak kullanıma sunar. İstemci kitaplıklarını kullandığınızda bu URI'ler sizin için oluşturulur, ancak istemci kitaplıklarını kullanmanız gerekmez. İsterseniz, OData hizmetlerine istemci kitaplıkları kullanılmadan doğrudan erişilebilir. İstemci kitaplıklarını kullanmadığınızda hizmetin konumu ve istenen veriler URI tarafından belirtilir ve sonuçlar HTTP isteğine yanıt olarak döndürülür. Bu ham veriler daha sonra istenen şekilde işlenebilir veya işlenebilir. OData sorgusunun sonuçlarını alma yollarından biri sınıfını WebClient kullanmaktır. Bu örnekte, ALFKI anahtarıyla temsil edilen müşterinin kişi adı alınır.
string uri = "http://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/ContactName";
WebClient client = new WebClient();
string data = client.DownloadString(uri);
Console.WriteLine($"Raw data returned:\n{data}");
Bu kod çalıştırıldığında konsolda aşağıdaki çıkış görüntülenir:
Raw data returned:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ContactName xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices">Maria Anders</ContactName>
Bir iş akışında, bu örnekteki kod tabanlı bir özel etkinliğin Executegeçersiz kılmasına CodeActivity dahil edilebilir, ancak aynı işlevsellik etkinliği kullanılarak InvokeMethod<TResult> da gerçekleştirilebilir. Etkinlik, InvokeMethod<TResult> iş akışı yazarlarının bir sınıfın statik ve örnek yöntemlerini çağırmasına olanak tanır ve ayrıca belirtilen yöntemi zaman uyumsuz olarak çağırma seçeneğine sahiptir. Aşağıdaki örnekte, sınıfın yöntemini InvokeMethod<TResult> çağıracak DownloadString ve bir müşteri listesi döndürecek şekilde bir WebClient etkinlik yapılandırılır.
new InvokeMethod<string>
{
TargetObject = new InArgument<WebClient>(new VisualBasicValue<WebClient>("New System.Net.WebClient()")),
MethodName = "DownloadString",
Parameters =
{
new InArgument<string>("http://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/Orders")
},
Result = data,
RunAsynchronously = true
},
InvokeMethod<TResult> bir sınıfın hem statik hem de örnek yöntemlerini çağırabilir.
DownloadString sınıfının bir örnek yöntemi WebClient olduğundan, için WebClientsınıfının yeni bir örneği TargetObject belirtilir.
DownloadString
MethodName, sorguyu içeren URI koleksiyonda Parameters belirtilir ve dönüş değeri değere Result atanır.
RunAsynchronously değeri olarak trueayarlanır. Bu, yöntem çağrısının iş akışıyla ilgili olarak zaman uyumsuz olarak çalıştırılacağı anlamına gelir. Aşağıdaki örnekte, etkinliği kullanarak InvokeMethod<TResult> belirli bir müşterinin sipariş listesi için örnek Northwind veri hizmetini sorgulayan bir iş akışı oluşturulur ve döndürülen veriler konsola yazılır.
Variable<string> data = new Variable<string>();
Activity wf = new Sequence
{
Variables = { data },
Activities =
{
new WriteLine
{
Text = "Calling WCF Data Service..."
},
new InvokeMethod<string>
{
TargetObject = new InArgument<WebClient>(new VisualBasicValue<WebClient>("New System.Net.WebClient()")),
MethodName = "DownloadString",
Parameters =
{
new InArgument<string>("http://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/Orders")
},
Result = data,
RunAsynchronously = true
},
new WriteLine
{
Text = new InArgument<string>(env => string.Format("Raw data returned:\n{0}", data.Get(env)))
}
}
};
WorkflowInvoker.Invoke(wf);
Bu iş akışı çağrıldığında konsolda aşağıdaki çıkış görüntülenir. Bu sorgu birkaç sipariş döndürdüğünden çıkışın yalnızca bir bölümü burada görüntülenir.
Calling WCF Data Service...
Raw data returned:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>*
<feed
xml:base="http://services.odata.org/Northwind/Northwind.svc/"
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
xmlns="http://www.w3.org/2005/Atom">
<title type="text">Orders\</title>
<id>http://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/Orders\</id>
<updated>2010-05-19T19:37:07Z\</updated>
<link rel="self" title="Orders" href="Orders" />
<entry>
<id>http://services.odata.org/Northwind/Northwind.svc/Orders(10643)\</id>
<title type="text">\</title>
<updated>2010-05-19T19:37:07Z\</updated>
<author>
<name />
</author>
<link rel="edit" title="Order" href="Orders(10643)" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Customer" type="application/atom+xml;type=entry" title="Customer" href="Orders(10643)/Customer" />
...
Bu örnek, iş akışı uygulaması yazarlarının OData hizmetinden döndürülen ham verileri kullanmak için kullanabileceği bir yöntem sağlar. URI'leri kullanarak WCF Veri Hizmetleri erişme hakkında daha fazla bilgi için bkz. Veri Hizmeti Kaynaklarına Erişme (WCF Veri Hizmetleri) ve OData: URI Kuralları.