簡體   English   中英

WCF中的ASP.NET會話通過Silverlight中的通道工廠

[英]Asp.net session in wcf via channel factory in silverlight

我的問題是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?

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

Silverlight可以正常使用ASP.NET會話,該ASP.NET會話使用上述cookie方法來傳遞會話信息。 使它與無cookie會話一起工作將很棘手,因為它需要將信息作為URL的一部分傳回。

有關更多信息,我已找到此博客條目

感謝您的回復,菲爾,但我已經完成了您之前提到的工作。 這當然是必需的,但這不是我的問題。

我需要將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();
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM