在wcf的Asp.net会议通过silverlight的渠道工厂

时间:2010-12-30 22:46:04

标签: .net asp.net silverlight wcf

我的问题是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的东西吗?

2 个答案:

答案 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();
        }