Mini Kabibi Habibi
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Web;
namespace DXSK8.Service {
[DataContract]
public class OAuthToken {
[DataMember(Name = "access_token")]
public string AccessToken { get; set; }
[DataMember(Name = "token_type")]
public string TokenType { get; set; }
}
public class PushNotifications {
private OAuthToken accessToken = null;
public void Notify(string url, string content) {
PostToWns(url, content);
}
private 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;
}
}
protected OAuthToken GetAccessToken(string secret, string sid) {
string urlEncodedSecret = HttpUtility.UrlEncode(secret);
string urlEncodedSid = HttpUtility.UrlEncode(sid);
string 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);
}
public string PostToWns(string uri, string xml, string type = "wns/toast") {
var secret = ConfigurationManager.AppSettings["WinStoreSecret"];
var sid = ConfigurationManager.AppSettings["WinStoreAppId"];
try {
if(accessToken == null) {
accessToken = GetAccessToken(secret, sid);
}
byte[] contentInBytes = Encoding.UTF8.GetBytes(xml);
// TODO: find more elegant solution for escaping the token
var uriStart = "https://db3.notify.windows.com/?token=";
var parts = uri.Split('=');
uri = uriStart + HttpUtility.UrlEncode(uri.Substring(uriStart.Length));
HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
request.Method = "POST";
request.Headers.Add("X-WNS-Type", type);
request.Headers.Add("Authorization", String.Format("Bearer {0}", accessToken.AccessToken));
using(Stream requestStream = request.GetRequestStream()) {
requestStream.Write(contentInBytes, 0, contentInBytes.Length);
}
using(HttpWebResponse webResponse = (HttpWebResponse)request.GetResponse()) {
return webResponse.StatusCode.ToString();
}
}
catch(WebException webException) {
string exceptionDetails = webException.Response.Headers["WWW-Authenticate"];
if(exceptionDetails != null && exceptionDetails.Contains("Token expired")) {
accessToken = null;
// Implement a maximum retry policy
return PostToWns(uri, xml, type);
}
else {
return "EXCEPTION: " + webException.Message;
}
}
catch(Exception ex) {
return "EXCEPTION: " + ex.Message;
}
}
}
}