Аутентификация Dataservice не работает с serviceContext.GetReadStreamUri (..) - PullRequest
1 голос
/ 09 августа 2011

У меня есть служба Odata и клиентское приложение WPF. К некоторым сервисным объектам Odata прикреплены изображения (например, клиент).

Потоковая передача работает до тех пор, пока я не применяю аутентификацию. Я могу просматривать и изменять изображения. Как только я применяю аутентификацию, все работает, как и ожидалось, учитывая учетные данные. Все, кроме изображений, которые есть. Вот соответствующие шаги кода / бекасы.

Код конструктора окон

bool iv = System.Web.Security.Membership.ValidateUser("userName", "pass");
ManageService = new InventoryContext(new Uri(...));
ManageService.SendingRequest += new EventHandler<SendingRequestEventArgs (ManageService_SendingRequest);

ManageService_SendingRequest code

//attach the authentication cookie to the request header
((HttpWebRequest)e.Request).CookieContainer = ((ClientFormsIdentity)Thread.CurrentPrincipal.Identity).AuthenticationCookies;

Вызов для извлечения данных является асинхронным с использованием фонового рабочего. Метод запроса ()

BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(FetchClient);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FetchClientsCompleted);
worker.RunWorkerAsync(ClientUUID);

FetchClient

var query = from o in ManageService.Clients where o.ClientUUID.Equals((Guid)e.Argument)
...
e.Result = query;

FetchClientsCompleted

var res = e.Result as DataServiceCollection<Client>;
DataContext = res[0];  //this is all working, with and without authentication
//the next line, binding the stream to the image throws 'unauthenticated'
//it works well if authentication is disabled 
imgClient.Source = new BitmapImage(ManageService.GetReadStreamUri(DataContext));

если я отлаживаю, метод SendingRequest, обычно вызываемый с любым запросом, НЕ запускается, вызывая GetReadStreamUri (...). Вот где я застрял, что нужно сделать для аутентификации в сервисе для получения потока?

Кроме того, я взял URI, сгенерированный ManageService.GetReadStreamUri (DataContext), вставил его в браузер, и он работает, изображение отображается в браузере, если оно зарегистрировано.

У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 10 августа 2011

Обработчик SendingRequest будет запускаться только для запроса, отправленного классом DataServiceContext (вашим ManageService).Но в случае с изображением вы получаете URL-адрес только из DataServiceContext и затем позволяете BitmapImage фактически выдавать HTTP-запрос на этот URL-адрес.Таким образом, событие не будет запущено по этому запросу.Я не знаю, есть ли у BitmapImage способ подключиться к конвейеру HTTP-запросов (я так не думаю).Вы можете выполнить этот запрос самостоятельно, а затем использовать поток ответов в качестве входных данных для растрового изображения, и в этом случае вы получаете полный контроль над запросом и, таким образом, можете соответствующим образом реализовать аутентификацию.

...