2012-06-04 2 views
0

У меня есть служба WCF, настроенная на использование состояния сеанса ASP.NET. Я тестировал эту службу WCF с клиентом WPF, и состояние сеанса поддерживается в разных веб-запросах.Доля Идентификатор сеанса ASP.NET между WCF и клиентом Http Silverlight

Теперь я пытаюсь использовать эту же службу WCF из приложения Silverlight, которое использует новый стек Http, не зависящий от браузера. Мне нужно использовать этот стек, чтобы понять наши ошибки службы WCF. Моя проблема заключается в том, что в этом случае мы не можем читать из ответов заголовок Set-Cookie с cookie ASP.NET_SessionId или задавать заголовок Cookie в запросах.

Это связывание с применением Silverligth:

<customBinding> 
    <binding name="customHttpBinding_IBasoaWebService" sendTimeout="01:00:00"> 
      <binaryMessageEncoding /> 
     <httpCookieContainer /> 
      <httpTransport maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" /> 
    </binding> 
    </customBinding> 

И это связывание службы WCF:

<basicHttpBinding> 
    <binding name="basicHTTP" closeTimeout="01:00:00" openTimeout="01:00:00" 
     maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
     receiveTimeout="01:00:00" sendTimeout="01:00:00" allowCookies="false"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
     maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
     <security mode="None" /> 
    </binding> 
    </basicHttpBinding> 

В Silverlight приложении мы используем этот код, чтобы прочитать Set -Cookie header в ответе:

  IHttpCookieContainerManager cookieManager = channel.GetProperty<IHttpCookieContainerManager>(); 
      if (cookieManager.CookieContainer == null) 
       cookieManager.CookieContainer = new CookieContainer(); 
      Uri applicationUri = new Uri(Application.Current.Host.Source, "../"); 
      string cookieString = cookieManager.CookieContainer.GetCookieHeader(applicationUri); 
      ParseCookieString(cookieString); 

И это код для установки ASP.NET Session ID печенья в запросе:

  IHttpCookieContainerManager cookieManager = channel.GetProperty<IHttpCookieContainerManager>(); 
      if (cookieManager.CookieContainer == null) 
       cookieManager.CookieContainer = new CookieContainer(); 
      Uri applicationUri = new Uri(Application.Current.Host.Source, "../"); 
      Cookie cookie = new Cookie("ASP.NET_SessionId", aspNetSessionId); 
      cookieManager.CookieContainer.Add(applicationUri, cookie); 

Проверка через Скрипач сообщения, которыми обмениваются я вижу, что служба WCF правильно передает заголовок Set-Cookie в первом ответе, но Silverlight не в состоянии прочитайте его. Я также попытался установить заголовок Cookie в запросе через класс CookieContainer, но не повезло. Я не вижу этого в Fiddler.

Может кто-нибудь дать мне совет о том, что я должен делать неправильно?

Большое спасибо заранее.

Хосе Антонио Arroba

ответ

0

Наконец-то я смог найти обходное решение для решения этой проблемы.

Причина, по которой заголовок Cookie не был отправлен с запросами, состоял в том, что я установил плохой Uri в объекте Cookie. Если я пытаюсь подключиться к http://localhost:8080/Service, кажется, что правильное значение Uri должно быть http://localhost:8080, а не http://localhost:8080/Service.

Однако мне все еще интересно, как читать Set-Cookie, отправленные сервером. Мое обходное решение заключается в отправке ASP.NET Session ID также в пользовательском SOAP-заголовке и читайте его на клиенте, что является IMHO довольно избыточным. Но это работает.

1

В веб-приложение, я использую URI для установки SessionID. (Я думаю, что это возможно с помощью службы WCF)

В web.config вашей службы, определить:

<system.web> 
    <sessionState cookieless="true"></sessionState> 
</system.web> 

или

<sessionState cookieless="UseUri"></sessionState> 

The appaears SESSIONID так:

http://localhost:51358/(S(1wnqb23d2qe4blfxzukligdo))/default.aspx 

Вы можете получить и установить SessionID в URI.

+0

Спасибо @Hyralex. Ваше предложение помогло мне подумать о другом способе отправки идентификатора сеанса ASP.NET. Наконец, я решил отправить его через пользовательский заголовок SOAP. Я не был уверен, будет ли режим «cookieless» работать с WCF и Silverlight –

Смежные вопросы