У меня чертовски трудно заставить WCF Data Services работать в Silverlight. Я использую VS2010 RC.
Я боролся с междоменной проблемой, требующей использования clientaccesspolicy.xml
& crossdomain.xml
файлов в корневой папке веб-сервера, но я просто не мог заставить это работать. Чтобы решить эту проблему, я прибегнул к тому, чтобы поместить и веб-приложение Silverlight, и службу данных WCF в один и тот же проект, но любой совет здесь будет полезен.
Но теперь, когда я действительно вижу свои данные, поступающие из базы данных и отображаемые в сетке данных в Silverlight, я подумал, что мои проблемы закончились - но нет. Я могу редактировать данные, и сущность в памяти меняется, но когда я вызываю BeginSaveChanges
(с соответствующим асинхронным вызовом EndSaveChanges
), я не получаю ошибок, но не обновляет данные в базе данных.
Вот мой код службы данных WCF:
public class MyDataService : DataService<MyEntities>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
protected override void OnStartProcessingRequest(ProcessRequestArgs args)
{
base.OnStartProcessingRequest(args);
HttpContext context = HttpContext.Current;
HttpCachePolicy c = HttpContext.Current.Response.Cache;
c.SetCacheability(HttpCacheability.ServerAndPrivate);
c.SetExpires(HttpContext.Current.Timestamp.AddSeconds(60));
c.VaryByHeaders["Accept"] = true;
c.VaryByHeaders["Accept-Charset"] = true;
c.VaryByHeaders["Accept-Encoding"] = true;
c.VaryByParams["*"] = true;
}
}
Я ущипнул код OnStartProcessingRequest
из статьи Скотта Хансельмана Создание OData API для StackOverflow, включая XML и JSON, за 30 минут .
Вот мой код из моего приложения Silverlight:
private MyEntities _wcfDataServicesEntities;
private CollectionViewSource _customersViewSource;
private ObservableCollection<Customer> _customers;
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this))
{
_wcfDataServicesEntities = new MyEntities(new Uri("http://localhost:7156/MyDataService.svc/"));
_customersViewSource = this.Resources["customersViewSource"] as CollectionViewSource;
DataServiceQuery<Customer> query = _wcfDataServicesEntities.Customer;
query.BeginExecute(result =>
{
_customers = new ObservableCollection<Customer>();
Array.ForEach(query.EndExecute(result).ToArray(), _customers.Add);
Dispatcher.BeginInvoke(() =>
{
_customersViewSource.Source = _customers;
});
}, null);
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
_wcfDataServicesEntities.BeginSaveChanges(r =>
{
var response = _wcfDataServicesEntities.EndSaveChanges(r);
string[] results = new[]
{
response.BatchStatusCode.ToString(),
response.IsBatchResponse.ToString()
};
_customers[0].FinAssistCompanyName = String.Join("|", results);
}, null);
}
Строка ответа, которую я получаю, привязывается к моей сетке и показывает «-1 | Ложь».
Мое намерение состоит в том, чтобы заставить работать концептуальное доказательство, а затем провести соответствующее разделение задач, чтобы превратить это в простое бизнес-приложение.
Я потратил на это часы. Меня сводят с ума. Есть идеи, как заставить это работать?