通过silverlight中的channel factory在wcf中进行Asp.net会话

通过silverlight中的channel factory在wcf中进行Asp.net会话,.net,asp.net,silverlight,wcf,.net,Asp.net,Silverlight,Wcf,我的问题是WCF不能在Silverlight调用之间保持会话。每个调用都是不同的asp.net会话。我知道它可以工作,因为我有一个在Silverlight中使用WCF自动生成代理的示例,但我使用Channel Factory。我在网上到处搜索,但遗憾的是,大多数人似乎都在使用代理生成器 <bindings> <basicHttpBinding> <binding name="databaseServiceBasicHttp" allowCookies="

我的问题是WCF不能在Silverlight调用之间保持会话。每个调用都是不同的asp.net会话。我知道它可以工作,因为我有一个在Silverlight中使用WCF自动生成代理的示例,但我使用Channel Factory。我在网上到处搜索,但遗憾的是,大多数人似乎都在使用代理生成器

<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>
我的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>

<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绑定配置

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

如何创建频道

<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>
var service = new ChannelFactory<IDatabaseService>("BlueGazelle.DatabaseService.Code.DatabaseService").CreateChannel();
var service=newchannelfactory(“BlueGazelle.DatabaseService.code.DatabaseService”).CreateChannel();

工厂有什么问题吗?我应该为它启用一些东西来携带cookies吗?

basicHttpBinding不提供任何WCF会话功能。但是,您仍然可以稍微小心地使ASP.NET会话处理正常工作。检查您是否已完成以下操作

<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>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<sessionState mode="InProc" cookieless="false" regenerateExpiredSessionId="true" timeout="20"/>
1,已将以下属性添加到服务接口

<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>
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
2,在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>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<sessionState mode="InProc" cookieless="false" regenerateExpiredSessionId="true" timeout="20"/>

3,在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>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<sessionState mode="InProc" cookieless="false" regenerateExpiredSessionId="true" timeout="20"/>

Silverlight在处理使用上述cookie方法传递会话信息的ASP.NET会话时没有问题。让它使用无Cookie会话将是一件棘手的事情,因为它需要将信息作为URL的一部分传回

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

更多信息,我已经找到了。

谢谢你的回复,菲尔,但我已经完成了你前面提到的事情。这当然是必要的,但这不是我的问题所在

<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>
我需要将cookie容器添加到生成的代理中。我在一个网页上找到了答案,但现在找不到

<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>
不管怎么说,如果有人好奇,这是密码

<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>
 var service = new ChannelFactory<IDatabaseService>("BlueGazelle.DatabaseService.Code.DatabaseService").CreateChannel();
        var cookieManager = ((IChannel)service).GetProperty<IHttpCookieContainerManager>();
        if (cookieManager.CookieContainer == null)
        {
            cookieManager.CookieContainer = new CookieContainer();
        }
var service=newchannelfactory(“BlueGazelle.DatabaseService.code.DatabaseService”).CreateChannel();
var cookieManager=((IChannel)服务).GetProperty();
if(cookieManager.CookieContainer==null)
{
cookieManager.CookieContainer=新CookieContainer();
}