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