数据服务身份验证不适用于 serviceContext.GetReadStreamUri(..)

发布于 2024-11-28 11:25:28 字数 1760 浏览 0 评论 0原文

我有一个 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 代码

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

获取数据的调用是使用后台工作程序异步进行的 Query Methode()

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(...)。 这就是我陷入困境的地方,如何对服务进行身份验证以获取流?

另外,我获取了 ManageService.GetReadStreamUri(DataContext) 生成的 URI,将其传递到浏览器中,它可以工作,如果登录,图像将显示在浏览器中。

有人有什么想法吗?

I have an Odata Service and a WPF client application.
Some of the Odata Service Entities have images attached to them (ie.Client).

The streaming works as long as I do not apply authentication. I can view and change the images. Once I enforce authentication everything works as expected, given the credentials check out. All but the images that is. Here are the relevant code steps / snipes.

Window Constructor code

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;

The call to fetch the data is async using background worker
Query Methode()

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));

if I debug, the SendingRequest methode, usually called with any query request is NOT triggered calling GetReadStreamUri(...).
This is where I am stuck, what to do to authenticate to the service to get the stream?

Also, I took the URI generated by ManageService.GetReadStreamUri(DataContext), past it into the browser and it works, the image is displayed in the browser, if logged in.

Anyone any ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云裳 2024-12-05 11:25:28

SendingRequest 处理程序只会针对 DataServiceContext 类(您的 ManageService)发送的请求触发。但对于图片来说,您只需从 DataServiceContext 获取 URL,然后让 BitmapImage 实际向该 URL 发出 HTTP 请求。因此该事件不会因该请求而触发。我不知道 BitmapImage 是否有办法让您连接到 HTTP 请求管道(我认为没有)。
您可以自己发出该请求,然后使用响应流作为位图图像的输入,在这种情况下,您可以完全控制该请求,从而可以适当地实施身份验证。

The SendingRequest handler will only fire for request sent by the DataServiceContext class (your ManageService). But in the case of the picture, you only get the URL from the DataServiceContext and then let the BitmapImage actually issue the HTTP request to that URL. So the event won't fire for that request. I don't know if BitmapImage has a way for you to hook into the HTTP request pipeline (I don't think it does).
You could issue that request yourself and then use the response stream as the input for the bitmap image, in which case you get full control over the request and thus can implement authentication as appropriate.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文