2014-02-15 2 views
0

Я разрабатываю небольшое приложение для Windows Store, которое использует WNS. Я создал приложение командной строки, которое отправляет тосты в WNS. После отправки сообщения из консольного приложения мое приложение для хранения Windows не получало никакого push-уведомления от WNS.Приложение Windows store не получает push-уведомление от WNS

Сценарий:

  1. Запуска Windows, магазин приложения, которые хранят URL с маркерами в файл, который Comman линии получает URL области применения и использовать его во время отправки тостов сообщений для WNS.
  2. Запустить консольное приложение, и он берет url из файла и отправляет созданное сообщение WNS.
  3. Мое приложение-победитель не получает никакого push-уведомления от WNS.

Приложение консоли успешно проходит процесс аутентификации. После отправки тоста я получил ответ от WNS со следующими заголовками:

X-WNS-DEVICECONNECTIONSTATUS: подключен

X-WNS-NOTIFICATIONSTATUS: получил

X-WNS-СТАТУС: получен

X-WNS-MSG-ID: 41C38906780D2A8C

X-WNS-ОТЛАДКА-TRACE: DB3WNS4011132

Content-Length: 0

Дата: Сб, 15 февраля 2014 17:12:12 GMT

После этого метода wnsManager_PushNotificationReceived не срабатывает. Приложение Windows связано с хранилищем.

код из приложения командной строки:

class Program 
    { 
     private static string secret = "Client secret"; 
     private static string SID = "Package Security Identifier (SID)"; 
     private static OAuthToken _token; 
     private static string XmlToastTemplate = @"<toast launch=""> 
<visual lang=""en-US""> 
<binding template=""ToastText01""> 
<text id=""1"">Test message</text> 
</binding> 
</visual> 
</toast>"; 
     private static Uri accesTokenuri = new Uri("https://login.live.com/accesstoken.srf"); 


     static void Main(string[] args) 
     { 
      if (_token == null) 
      { 
       CreateToken(); 
      } 

      var message = String.Empty; 
      while(true) 
      { 
       Console.WriteLine("Enter toast message"); 
       message = Console.ReadLine(); 
       if (message == "exit") break; 
       else 
       { 
        var uriWithToken = GetUriWithToken(); 
        var wc = HttpWebRequest.Create(uriWithToken) as HttpWebRequest; 
        wc.Method = "POST"; 
        wc.Headers.Add("X-WNS-Type", "wns/toast"); 
        wc.Headers.Add("X-WNS-RequestForStatus", "true"); 
        wc.Headers.Add("Authorization", String.Format("Bearer {0}", _token.AccessToken)); 
        wc.ContentType = "text/xml"; 
        var byteContent = Encoding.UTF8.GetBytes(XmlToastTemplate); 
        using (var requestStream = wc.GetRequestStream()) 
        { 
         requestStream.Write(byteContent,0,byteContent.Length); 
        } 

        using (var response = wc.GetResponse() as HttpWebResponse) 
        { 
         if (response != null) 
         { 
          var statusCode = response.StatusCode; 
          Console.WriteLine(statusCode); 
         } 
        } 

       } 


      } 
      Console.WriteLine("Press any key to exit."); 
      Console.ReadKey(); 
     } 

     private static string GetUriWithToken() 
     { 
      using(var file = File.OpenText(@"C:\Users\Michas\Pictures\uri.text")) 
      { 
      return file.ReadToEnd(); 
      } 
     } 

     private static void CreateToken() 
     { 
      var encSid = WebUtility.UrlEncode(SID); 
      var encSecret = WebUtility.UrlEncode(secret); 

      var body = 
       String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=notify.windows.com", 
        encSid, encSecret); 

      var wb = new WebClient(); 
      wb.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 
      var response = wb.UploadString(accesTokenuri , body); 
      _token = GetOAuthJSON(response); 
     } 

     private static OAuthToken GetOAuthJSON(string json) 
     { 
      using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
      { 
       var ser = new DataContractJsonSerializer(typeof(OAuthToken)); 
       var oAuthToken = (OAuthToken)ser.ReadObject(ms); 
       return oAuthToken; 
      } 
     } 

     [DataContract] 
     class OAuthToken 
     { 
      [DataMember(Name = "access_token")] 
      public string AccessToken { get; set; } 
      [DataMember(Name = "token_type")] 
      public string TokenType { get; set; } 
     } 
    } 

код из окна Маркет:

private async void WNSExample() 
      { 
       try 
       { 
        var wnsManager = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync(); 

        wnsManager.PushNotificationReceived += wnsManager_PushNotificationReceived; 
        SaveUriToFile(wnsManager.Uri); 
       (Exception ex) 
       { 

       } 
      } 
private async void SaveUriToFile(string uri) 
     { 
      var storageFile = await Windows.Storage.KnownFolders.PicturesLibrary.CreateFileAsync("uri.text", CreationCollisionOption.ReplaceExisting); 
      using (var stream = await storageFile.OpenStreamForWriteAsync()) 
      { 
       using (var textWriter = new StreamWriter(stream)) 
       { 
        textWriter.Write(uri); 
        textWriter.Flush(); 
       } 
      } 
} 

ответ

2

Проблемы заключается в синтаксисе шаблона: запуск = ""

должен быть

launch = "" ""

Или оставьте параметр lauch.

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