Windows Phone 7 - Cookies未发送到WCF服务

3
我有一堆位于一个域中的WCF服务:
  • AuthenticationService (标准MS,通过HTTPS)
  • AppService (HTTP)
通常,我调用身份验证服务并返回一个cookie。对于桌面应用程序,我会在每次调用AppService时分离cookie并重新附加它,该服务公开了我的API的主体。
浏览器中的Silverlight自动将cookie附加到对域的所有调用中。我期望手机也是这样做的。
它没有。
无法访问头,因此手动操作不行。我想知道是否因为MS的某个聪明人认为手机应该强制执行cookie仅重新附加到同一域上的HTTPS端点或其他原因...
救命啊!!
由于手机不支持另一个主要帮助设置;忽略自签名证书,因此这是一个噩梦。
谢谢,
卢克
**更新**
虽然我正在使用CookieContainer方法进行跟进,但必须指出,即使在Silverlight中Headers集合中缺少Add方法,仍可以使用索引器添加标头。

请查看http://cisforcoder.wordpress.com/2010/12/01/how-to-implement-basic-http-authentication-in-wcf-on-windows-phone-7/了解如何在Windows Phone 7上实现基本的HTTP身份验证。

** 更新2 **

可以按照Lex的答案设置CookieContainer。我现在被卡住了,继续调查WCF客户端中引用.cs EndInvoke时抛出的ArgumentNullException。我的服务器没有接收到调用的任何迹象。

堆栈上的两个关键调用是:

System.Net.Browser.HttpWebRequestHelper.ParseHeaders

并且

MS.Internal.InternalWebRequest.OnDownloadFailed

最终更新

当针对一个自签名证书的服务器调用时,似乎会抛出ArgumentNullException异常。

然而,模拟器/SDK存在一些奇怪的问题。我在所有服务器上都遇到了这个异常,即使是那些没有SSL的服务器,以及一个已经发行证书的服务器。

我也遇到了一些只有通过本地重新启动才能解决的问题。因此,我认为我的问题是由于SDK中的其他问题导致我认为代码有问题,但实际上是正确的。

不确定该给出什么建议,除了要对源自WP7 WCF堆栈的异常持怀疑态度,特别是EndpointNotFoundException和ArgumentNullException,并拥有一个完整的框架测试客户端应用程序作为健全性检查。

Luke


值得注意的是,CookieContainer中的HTTPOnly cookie是不可见的,因此不能在手机应用程序激活/会话之间持久化。 - Luke Puplett
只是顺便提一下,我也遇到了一个问题长达6个月,即模拟器似乎无法发送cookie,但设备可以。这也是7.1 SDK的一个问题。 - Luke Puplett
1个回答

1
在桌面 SL 中,我通过在客户端 http 堆栈中的服务代理之间共享 cookie 容器来实现这一点。在 WP7 上没有尝试过,但你可以尝试一下。
首先,你需要在客户端绑定配置中插入 (通常在 ServiceReferences.ClientConfig 文件中)。
然后,在代码中切换到客户端 http 堆栈。
WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
WebRequest.RegisterPrefix("https://", WebRequestCreator.ClientHttp);

然后您需要创建一个CookieContainer实例并将其分配给所有服务代理。

var cc = new CookieContainer();
var service1 = new ServiceReference1.MyService1Client { CookieContainer = cc };
var service2 = new ServiceReference2.MyService2Client { CookieContainer = cc };

现在,当您的 cookie 容器接收到 cookie 时,它将为所有 Web 服务重复使用它。请确保 cookie 带有正确的路径设置。


谢谢Lex - 我确实尝试过这个想法,但在访问CookieContainer时会抛出异常:无法设置CookieContainer。请确保绑定包含HttpCookieContainerBindingElement。 - Luke Puplett
@Like,解析器吞噬了我的XML元素。让我编辑一下帖子。 - Lex Lavnikov
我没有使用那个 WebRequest.RegisterPrefix 代码,所以可能是因为这个原因导致了错误。我会检查一下。 - Luke Puplett
是的,我也刚到那里。在 WP7 ClientConfig 文件中的绑定上启用 enableHttpCookieContainer="true"。我们可能正在迈向突破。 - Luke Puplett
尽管在WP7 Silverlight上执行时出现问题,但仍需为提供技术上准确的答案点赞加1。 - Luke Puplett
@Luke - WP7只有一个IWebRequestCreate的实现,因此对RegisterPrefix的调用是不必要的。 - Richard Szalay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接