Silverlight 4 HtmlPage.Document.Cookies всегда пуст - PullRequest
1 голос
/ 09 марта 2011

Я очень плохо знаком с Silverlight, поэтому, пожалуйста, предположите, что я сделал что-то очень глупое ...

Я пытаюсь позвонить из приложения silverlight в службу WCF и проверитьзначение в сеансе.Значение будет помещено на страницу aspx.Это немного запутанно, но вот где мы находимся.

Мой сервис выглядит так:

[ServiceContract]
public interface IExportStatus
{
    [OperationContract]
    ExportState RequestExportComplete();
}

public enum ExportState
{
    Running,
    Complete
}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ExportStatus : IExportStatus
{
    ExportState IExportStatus.RequestExportComplete()
    {
       // check value of session variable here.
    }
}

Сайт, на котором размещено приложение silverlight, также содержит сервис wcf.Его веб-конфигурация выглядит следующим образом:

<configuration>
    <system.serviceModel>
        <services>
            <service name="SUV_MVVM.Web.Services.ExportStatus" behaviorConfiguration="MyBehavior">
                <endpoint binding="basicHttpBinding"
                          bindingConfiguration="MyHttpBinding"
                          contract="SUV_MVVM.Web.Services.IExportStatus"
                          address="" />
            </service>
        </services>
        <bindings>
            <basicHttpBinding>
                <binding name="MyHttpBinding" />
             </basicHttpBinding>
         </bindings>
         <behaviors>
             <serviceBehaviors>
                 <behavior name="MyBehavior">
                     <serviceMetadata httpGetEnabled="true" />
                     <serviceDebug includeExceptionDetailInFaults="false" />
                 </behavior>
             </serviceBehaviors>
         </behaviors>
         <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
     </system.serviceModel>
     <system.webServer>
         <modules runAllManagedModulesForAllRequests="true"/>
     </system.webServer>
</configuration>

Я добавил сервисную ссылку в свое приложение silverlight, используя инструмент VS, за исключением значений по умолчанию (кроме пространства имен)

Сначала я просто пыталсявызовите службу следующим образом:

var proxy = new ExportStatusClient();
proxy.RequestExportCompleteCompleted += (s, e) =>
                                        {
                                            //Handle result
                                        };

proxy.RequestExportCompleteAsync();

Но сеанс в службе всегда был пустым (не нулевым, просто пустым), поэтому я попытался вручную задать идентификатор сеанса в запросе следующим образом:

var proxy = new ExportStatusClient();
using (new OperationContextScope(proxy.InnerChannel))
{
    var request = new HttpRequestMessageProperty();
    //this might chnage if we alter the cookie name in the web config.
    request.Headers["ASP.NET_SessionId"] = GetCookie("ASP.NET_SessionId");
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = request;
    proxy.RequestExportCompleteCompleted += (s, e) =>
                                            {
                                                //Handle result
                                            };

     proxy.RequestExportCompleteAsync();
  }

  private string GetCookie(string key)
  {
      var cookies = HtmlPage.Document.Cookies.Split(';');

        return (from cookie in cookies
                select cookie.Split('=')
                into keyValue 
                where keyValue.Length == 2 && keyValue[0] == key 
                select keyValue[1]).FirstOrDefault();
    }

Но я обнаружил, что свойство HtmlPage.Document.Cookies всегда пусто.

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

1 Ответ

0 голосов
/ 20 мая 2011

Я только что провел тест из приложения Silverlight 4.

System.Windows.Browser.HtmlPage.Document.Cookies = "KeyName1 = KeyValue1; expires =" + DateTime.UtcNow.AddSeconds (10) .ToString ("R"); System.Windows.Browser.HtmlPage.Document.Cookies = "KeyName2 = KeyValue2; expires =" + DateTime.UtcNow.AddSeconds (60) .ToString ("R");

Срок действия каждого файла cookie истек, как и ожидалось.

Значение System.Windows.Browser.HtmlPage.Document.Cookies ...

Сразу после установки файлов cookie: «KeyName1 = KeyValue1; KeyName2 = KeyValue2»

30 секунд спустя: "KeyName2 = KeyValue2"

60 + секунд спустя: ""

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...