2016-07-11 4 views
0

에 C#을에서 WNS 토스트 알림을 보낼 수 없습니다 : https://msdn.microsoft.com/en-us/library/windows/apps/hh202945(v=vs.105).aspx https://msdn.microsoft.com/library/windows/apps/xaml/hh868252왜 나는이 두 가지 가이드를 따라 한 윈도우 폰 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 라우트로 이동하려고 시도했습니다.이 경우, "Device subscription has expired"오류가 발생합니다. 여기 간다 :

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>") 
     }); 
    } 

업데이트 :

그것은 하나 관련 인코딩되지 않습니다. =와 + 기호가있는 인코딩되지 않은 토큰과 인코딩 된 토큰을 모두 사용했습니다. 여전히 404

+0

하단의 '수정'링크를 사용하여 실제 질문을 업데이트해야 추가 정보를 포함 할 수 있습니다. – user3788685

+0

완료. 전 것들을 깨끗하게 유지하기 위해 이전의 것들을 지워 봤습니다. – user2485309

답변

0

WNS에 대한 HTTP 404 오류는 WNS에서 이해할 수 없도록 채널 URI 자체가 munged되었음을 의미합니다. 채널 URI가 어딘가에 tolower() 된 것처럼 코드에서 보입니다. 일반적으로 토큰은 "AwYAAAD"와 같은 것으로 시작합니다. 채널 URI를 소문자로 제거하십시오.

WNS를 원할 때 WNS 및 MSDN 설명서를 혼합하는 것처럼 보입니다 (404 오류가 발생하지는 않지만). This은 WNS이지만 this은 MPNS 설명서입니다. 특히, 이러한 헤더는 MPN이 용이며 WNS에 의해 무시되거나 실패됩니다

  • X-WindowsPhone과-대상
  • X-NotificationClass
  • X-NotificationStatus
  • X-SubscriptionStatus
  • X- DeviceConnectionStatus

대신 these WNS 헤더를 사용하고 싶습니다.

+0

"채널 URI 자체가 빗나갔습니다."사례가있었습니다. 난 그냥 MPNS없이 바닐라 WNS를 사용하여 필사적으로 섞어서 매칭 해 보았습니다. – user2485309