2016-07-11 8 views
0

Я следовал за эти две направляющие: https://msdn.microsoft.com/en-us/library/windows/apps/hh202945(v=vs.105).aspx https://msdn.microsoft.com/library/windows/apps/xaml/hh868252почему я не могу отправить WNS уведомление тост из C# для Windows Phone 8,1

Полученный код является следующее. Несмотря на все это кажется правильным, он возвращает ошибку 404. Как это может быть? Любая помощь задержит мое самоубийство.

public static void PushToWindows2() 
    { 
     try 
     { 
      var accessToken = GetAccessToken("Nhz******************XkwX", "ms-app://s-1-15-2-***************-2150981501"); 

      byte[] contentInBytes = Encoding.UTF8.GetBytes("<toast launch=\"\"><visual lang=\"en-US\"><binding template=\"ToastImageAndText01\"><image id=\"1\" src=\"World\" /><text id=\"1\">Hello</text></binding></visual></toast>"); 

      HttpWebRequest request = HttpWebRequest.Create("https://db5.notify.windows.com/?token=awyaaaborhlhub%2bfxeytzjnz****************pftroh5l18sgorvgrkq%3d") as HttpWebRequest; 
      request.Method = "POST"; 
      request.ContentLength = contentInBytes.Length; 
      request.ContentType= "text/xml"; 
      request.Headers.Add("X-WindowsPhone-Target", "token"); 
      request.Headers.Add("X-NotificationClass", "1"); ; 
      request.Headers.Add("X-WNS-Type", "wns/toast"); 
      request.Headers.Add("Authorization", String.Format("Bearer {0}", accessToken.AccessToken.ToString())); 


      using (Stream requestStream = request.GetRequestStream()) 
       requestStream.Write(contentInBytes, 0, contentInBytes.Length); 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      string notificationStatus = response.Headers["X-NotificationStatus"]; 
      string notificationChannelStatus = response.Headers["X-SubscriptionStatus"]; 
      string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"]; 
     } 
     catch (Exception ex) 
     { 
      Console.Write("EXCEPTION: " + ex.Message); 
     } 
    } 
    [DataContract] 
    public class OAuthToken 
    { 
     [DataMember(Name = "access_token")] 
     public string AccessToken { get; set; } 
     [DataMember(Name = "token_type")] 
     public string TokenType { get; set; } 
    } 

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

    public static OAuthToken GetAccessToken(string secret, string sid) 
    { 
     var urlEncodedSecret = HttpUtility.UrlEncode(secret); 
     var urlEncodedSid = HttpUtility.UrlEncode(sid); 

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

     string response; 
     using (var client = new WebClient()) 
     { 
      client.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 
      response = client.UploadString("https://login.live.com/accesstoken.srf", body); 
     } 
     return GetOAuthTokenFromJson(response); 
    } 

Я также попытался пройти маршрут PushSharp, в этом случае, я получаю «подписка на устройство истек» ошибка. Здесь идет:

var config = new WnsConfiguration("424****.*******nts", "ms-app://s-1-15-2-***************1501", "Nhz************XkwX"); 
     // Create a new broker 
     var wnsBroker = new WnsServiceBroker (config); 
     wnsBroker.QueueNotification(new WnsToastNotification { 
       ChannelUri = deviceId, 
       Payload = XElement.Parse (@" 
        <toast> 
         <visual> 
          <binding template=""ToastText01""> 
           <text id=""1"">WNS_Send_Single</text> 
          </binding> 
         </visual> 
        </toast>") 
     }); 
    } 

Update:

Это не кодирующая родственный либо. Я использовал как некодированный токен с знаками = и +, так и кодировкой. Тем не менее 404

+0

Вы должны обновить свой фактический вопрос, используя ссылку «Изменить» внизу, чтобы включить эту дополнительную информацию. – user3788685

+0

Готово. Я удалил предыдущие, чтобы сохранить чистоту – user2485309

ответ

0

Ошибка HTTP 404 для WNS означает, что сам URI канала был заглушен так, что WNS не может его понять. Похоже, что из вашего кода URI канала получает tolower() ed где-то - обычно токены начинаются с чего-то типа «AwYAAAD». Попробуйте удалить все, что меньше, чем URI канала.

Кроме того, похоже, что вы смешиваете документацию WNS и MSDN, если хотите WNS (хотя это не вызывает ошибок 404). This - WNS, но this - документация MPNS. В частности, эти заголовки для MPNS и будут игнорироваться или не по WNS:

  • X-WindowsPhone-Target
  • X-NotificationClass
  • X-NotificationStatus
  • X-SubscriptionStatus
  • Х- DeviceConnectionStatus

Вместо этого вы хотите использовать заголовки WNS these.

+0

. «URI канала сам был запутан». Я просто пытался смешивать и сопоставлять из отчаяния, как правило, я использую ванильный WNS без MPNS – user2485309