我的问题是WCF没有在Silverlight调用之间保持会话。每次通话都是一个不同的asp.net会话。我知道它可以工作,因为我有一个在Silverlight中使用自动生成的WCF代理的示例,但我使用Channel Factory。我在网上搜索过,但遗憾的是大多数人似乎都在使用代理生成器。
我的web.config
<bindings>
<basicHttpBinding>
<binding name="databaseServiceBasicHttp" allowCookies="true" />
</basicHttpBinding>
</bindings>
<services>
<service name="databaseService"
behaviorConfiguration="Debug">
<endpoint address=""
binding="basicHttpBinding" bindingConfiguration="databaseServiceBasicHttp" contract="BlueGazelle.DatabaseServiceContracts.IDatabaseService" />
</service>
</services>
Silverlight绑定配置
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding >
<binding name="databaseService" enableHttpCookieContainer="true"/>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:53392/Services/DatabaseService.svc"
binding="basicHttpBinding" bindingConfiguration="databaseService" contract="BlueGazelle.DatabaseServiceContracts.IDatabaseService"
name="BlueGazelle.DatabaseService.Code.DatabaseService"/>
</client>
</system.serviceModel>
</configuration>
我如何创建频道
var service = new ChannelFactory<IDatabaseService>("BlueGazelle.DatabaseService.Code.DatabaseService").CreateChannel();
ChannelFactory有问题吗?我应该为它提供携带cookie的东西吗?
答案 0 :(得分:0)
basicHttpBinding绑定不提供任何WCF会话功能。但是你仍然可以稍微小心地处理ASP.NET会话。检查您是否已完成以下操作...
1,在服务界面中添加了以下属性...
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
2,在你的web.config中添加以下内容......
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
3,在你的web.config中添加以下内容......
<sessionState mode="InProc" cookieless="false" regenerateExpiredSessionId="true" timeout="20"/>
使用上述cookie方法传递会话信息的ASP.NET会话使用Silverlight没有问题。让它使用无cookie会话将是棘手的,因为它需要将信息作为URL的一部分传回。
有关详细信息,我发现了blog entry。
答案 1 :(得分:0)
感谢您对Phil的回复,但我已经完成了您之前提到的内容。当然需要它,但在我的情况下这不是问题。
我需要在生成的代理中添加cookie容器。我在一个网页上找到了答案,但现在找不到。
无论如何,这是代码,如果有人好奇。
var service = new ChannelFactory<IDatabaseService>("BlueGazelle.DatabaseService.Code.DatabaseService").CreateChannel();
var cookieManager = ((IChannel)service).GetProperty<IHttpCookieContainerManager>();
if (cookieManager.CookieContainer == null)
{
cookieManager.CookieContainer = new CookieContainer();
}