黑莓推送服务的C#服务器端
我正在尝试向我的黑莓应用程序发送推送消息。黑莓通过黑莓推送服务的C#服务器端,c#,asp.net,blackberry,push-notification,push,C#,Asp.net,Blackberry,Push Notification,Push,我正在尝试向我的黑莓应用程序发送推送消息。黑莓通过php服务器端代码成功接收消息。然而,我在c#服务器端代码上挣扎了很长一段时间。以下是我正在运行的代码: string userName = "<appID>"; string userPW = "<password>"; public static void SetBasicAuthHeader(WebRequest req, String userName, String userPassword)
php
服务器端代码成功接收消息。然而,我在c#服务器端代码上挣扎了很长一段时间。以下是我正在运行的代码:
string userName = "<appID>";
string userPW = "<password>";
public static void SetBasicAuthHeader(WebRequest req, String userName, String userPassword)
{
string authInfo = userName + ":" + userPassword;
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
req.Headers["Authorization"] = "Basic " + authInfo;
}
public static void SetProxy(WebRequest req)
{
Uri newUri = new Uri("http://cp(AppID).pushapi.eval.blackberry.com");
WebProxy proxy = new WebProxy();
proxy.Address = newUri;
proxy.Credentials = new NetworkCredential("<appID>", "<password>");
req.Proxy = proxy;
}
public bool pushTest(string msg)
{
HttpWebResponse HttpWRes = null;
HttpWebRequest HttpWReq = null;
string pin = "xxxxxxxx"; // or actual pin of device
string applicationID = "xxxxxxxxxxxxxxxxxxxxxx";
string BOUNDARY = "mPsbVQo0a68eIL3OAxnm";
//string msg1 = "testing c#"; // the message to send
string userName = "<appID>";
string userPW = "<password>";
string url = "https://pushapi.eval.blackberry.com/mss/PD_pushRequest";
HttpWReq = (HttpWebRequest)WebRequest.Create(url);
SetProxy(HttpWReq);
HttpWReq.Method = ("POST");
HttpWReq.Accept = "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2";
//HttpWReq.Credentials = new NetworkCredential(userName, userPW);
HttpWReq.PreAuthenticate = true;
HttpWReq.ContentType = "multipart/related; boundary=" + BOUNDARY + "; type=application/xml";
SetBasicAuthHeader(HttpWReq, userName, userPW);
StringBuilder dataToSend = new StringBuilder();
dataToSend.AppendLine("--" + BOUNDARY);
dataToSend.AppendLine("Content-Type: application/xml; charset=UTF-8");
dataToSend.AppendLine("");
dataToSend.AppendLine("<?xml version=\"1.0\"?>");
dataToSend.AppendLine("<!DOCTYPE pap PUBLIC \"-//WAPFORUM//DTD PAP 2.1//EN\" \"http://www.openmobilealliance.org/tech/DTD/pap_2.1.dtd\">");
dataToSend.AppendLine("<pap>");
string myPushId = DateTime.Now.ToFileTime().ToString();
dataToSend.AppendLine("<push-message push-id=\"" + myPushId + "\" source-reference=\"" + applicationID + "\">");
dataToSend.AppendLine("<address address-value=\"" + pin + "\"/>");
dataToSend.AppendLine("<quality-of-service delivery-method=\"unconfirmed\"/>");
dataToSend.AppendLine("</push-message>");
dataToSend.AppendLine("</pap>");
dataToSend.AppendLine("--" + BOUNDARY);
dataToSend.AppendLine("Content-Type: text/plain");
dataToSend.AppendLine("Push-Message-ID: " + myPushId);
dataToSend.AppendLine("");
dataToSend.AppendLine(msg);
dataToSend.AppendLine("--" + BOUNDARY + "--");
dataToSend.AppendLine("");
Stream requestStream = null;
string pushResult = "";
try
{
requestStream = HttpWReq.GetRequestStream();
}
catch (Exception ex)
{
pushResult = "Push failed! " + ex.ToString();
}
byte[] outStr = new ASCIIEncoding().GetBytes(dataToSend.ToString());
requestStream.Write(outStr, 0, outStr.Length);
requestStream.Close();
try
{
HttpWRes = (HttpWebResponse)HttpWReq.GetResponse();
// MessageBox.show(""+HttpWRes);
}
catch (Exception ex)
{
//push failed
}
if (HttpWRes != null)
{
HttpWRes.Close();
}
return true;
}
应用的凭据或URL是否存在任何问题?请帮忙 奇怪的是,为什么要注释掉代码中的HttpsWReq.Credentials=new NetowrkCredential(“用户名”、“密码”)部分 try-catch语句正在执行HttpWReq.GetRequestStream();尽管一切看起来都在那里。另一个问题可能是调用SetProxy的强制转换和方法参数。应为WebRequest类型 HttpWReq=(HttpWebRequest)WebRequest.Create(url)
您是什么时候申请凭证的(EVAL/Production?我设法解决了这个问题。上面代码中的主要问题是构建
Http
请求
WebRequest tRequest;
tRequest = WebRequest.Create(httpURL);
tRequest.Method = "POST";
tRequest.Credentials = new NetworkCredential(appid, password);
另一个需要处理的重要事项是通过上述NetworkCredentials
发出请求时发生的Http响应401
。要处理此问题,在发出请求时应调用以下方法:
public static void SetBasicAuthHeader(WebRequest req, String appID, String userPassword)
{
string authInfo = appID + ":" + userPassword;
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
req.Headers["Authorization"] = "Basic " + authInfo;
}
推送消息的完整服务器端代码如下:
private void pushMessageSample(string pushedMessage)
{
String appid="xxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx";
String password = "xxxxxx";
String deliverbefore = DateTime.UtcNow.AddMinutes(5).ToString("s",System.Globalization.CultureInfo.InvariantCulture) + "Z";
String pushPin = "xxxxxxxx";
String Boundary = "mPsbVQo0a68eIL3OAxnm";
StringBuilder dataToSend = new StringBuilder();
dataToSend.AppendLine("--" + Boundary);
dataToSend.AppendLine("Content-Type: application/xml; charset=UTF-8");
dataToSend.AppendLine("");
dataToSend.AppendLine("<?xml version=\"1.0\"?>");
dataToSend.AppendLine("<!DOCTYPE pap PUBLIC \"-//WAPFORUM//DTD PAP 2.1//EN\" \"http://www.openmobilealliance.org/tech/DTD/pap_2.1.dtd\">");
dataToSend.AppendLine("<pap>");
string myPushId = DateTime.Now.ToFileTime().ToString();
dataToSend.AppendLine("<push-message push-id=" + (char)34 + myPushId + (char)34 + " deliver-before-timestamp=" +
(char)34 + deliverbefore + (char)34 + " source-reference=" + (char)34 + appid + (char)34 + ">");
//dataToSend.AppendLine("<push-message push-id=\"" + myPushId + "\" source-reference=\"" + appid + "\">");
dataToSend.AppendLine("<address address-value=\"" + pushPin + "\"/>");
dataToSend.AppendLine("<quality-of-service delivery-method=\"unconfirmed\"/>");
dataToSend.AppendLine("</push-message>");
dataToSend.AppendLine("</pap>");
dataToSend.AppendLine("--" + Boundary);
dataToSend.AppendLine("Content-Type: text/plain");
dataToSend.AppendLine("Push-Message-ID: " + myPushId);
dataToSend.AppendLine("");
dataToSend.AppendLine(pushedMessage);
dataToSend.AppendLine("--" + Boundary + "--");
dataToSend.AppendLine("");
byte[] bytes = Encoding.ASCII.GetBytes(dataToSend.ToString());
String httpURL = "https://cpxxxx.pushapi.eval.blackberry.com/mss/PD_pushRequest";
WebRequest tRequest;
tRequest = WebRequest.Create(httpURL);
tRequest.Method = "POST";
tRequest.Credentials = new NetworkCredential(appid, password);
tRequest.PreAuthenticate = true;
tRequest.ContentType = "multipart/related; boundary=" + Boundary + "; type=application/xml";
tRequest.ContentLength = bytes.Length;
string rawCredentials = string.Format("{0}:{1}", appid, password);
tRequest.Headers.Add("Authorization",string.Format("Basic {0}",
Convert.ToBase64String(Encoding.UTF8.GetBytes(rawCredentials))));
SetBasicAuthHeader(tRequest, appid, password);
Stream dataStream = tRequest.GetRequestStream();
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();
WebResponse tResponse = tRequest.GetResponse();
dataStream = tResponse.GetResponseStream();
StreamReader tReader = new StreamReader(dataStream);
String sResponseFromServer = tReader.ReadToEnd();
tReader.Close();
dataStream.Close();
tResponse.Close();
}
private void pushMessageSample(字符串pushedMessage)
{
字符串appid=“xxxx-XXXXXXXXXXXXXXXXXXXXXX”;
字符串密码=“xxxxxx”;
String deliverbefore=DateTime.UtcNow.AddMinutes(5).ToString(“s”,System.Globalization.CultureInfo.InvariantCulture)+“Z”;
字符串图钉=“xxxxxxxx”;
字符串边界=“mPsbVQo0a68eIL3OAxnm”;
StringBuilder dataToSend=新建StringBuilder();
dataToSend.AppendLine(“-”+边界);
AppendLine(“内容类型:application/xml;charset=UTF-8”);
dataToSend.AppendLine(“”);
dataToSend.AppendLine(“”);
dataToSend.AppendLine(“”);
dataToSend.AppendLine(“”);
字符串myPushId=DateTime.Now.ToFileTime().ToString();
dataToSend.AppendLine(“”);
//dataToSend.AppendLine(“”);
dataToSend.AppendLine(“”);
dataToSend.AppendLine(“”);
dataToSend.AppendLine(“”);
dataToSend.AppendLine(“”);
dataToSend.AppendLine(“-”+边界);
AppendLine(“内容类型:text/plain”);
dataToSend.AppendLine(“推送消息ID:+myPushId”);
dataToSend.AppendLine(“”);
dataToSend.AppendLine(pushedMessage);
dataToSend.AppendLine(“-”+边界+“-”);
dataToSend.AppendLine(“”);
byte[]bytes=Encoding.ASCII.GetBytes(dataToSend.ToString());
字符串httpURL=”https://cpxxxx.pushapi.eval.blackberry.com/mss/PD_pushRequest";
WebRequest-tRequest;
tRequest=WebRequest.Create(httpURL);
tRequest.Method=“POST”;
tRequest.Credentials=新的网络凭据(appid,密码);
tRequest.PreAuthenticate=true;
tRequest.ContentType=“多部分/相关;边界=“+boundary+”;类型=应用程序/xml”;
tRequest.ContentLength=字节.Length;
string rawCredentials=string.Format(“{0}:{1}”,appid,password);
添加(“授权”,string.Format(“基本{0}”),
Convert.ToBase64String(Encoding.UTF8.GetBytes(rawCredentials));
SetBasicAuthHeader(tRequest、appid、密码);
Stream dataStream=tRequest.GetRequestStream();
dataStream.Write(字节,0,字节.长度);
dataStream.Close();
WebResponse-treresponse=tRequest.GetResponse();
dataStream=treresponse.GetResponseStream();
StreamReader tReader=新的StreamReader(数据流);
字符串sResponseFromServer=tReader.ReadToEnd();
tReader.Close();
dataStream.Close();
t响应关闭();
}
5天前我申请了凭据。它们是评估凭据。我正在调试我的代码,因此注释掉了HttpsWReq.credentials=new NetowrkCredential(“用户名”、“密码”)
仅用于测试目的。有或没有这行代码,结果都是一样的。有帮助吗?是的,我设法解决了这个问题。我将在下面为面临相同问题的任何人发布我的最终代码。是的,我确实删除了SetProxy
方法。如果它解决了问题,您可以接受自己的答案。这将让我们知道这个问题不需要更多的帮助。
public static void SetBasicAuthHeader(WebRequest req, String appID, String userPassword)
{
string authInfo = appID + ":" + userPassword;
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
req.Headers["Authorization"] = "Basic " + authInfo;
}
private void pushMessageSample(string pushedMessage)
{
String appid="xxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx";
String password = "xxxxxx";
String deliverbefore = DateTime.UtcNow.AddMinutes(5).ToString("s",System.Globalization.CultureInfo.InvariantCulture) + "Z";
String pushPin = "xxxxxxxx";
String Boundary = "mPsbVQo0a68eIL3OAxnm";
StringBuilder dataToSend = new StringBuilder();
dataToSend.AppendLine("--" + Boundary);
dataToSend.AppendLine("Content-Type: application/xml; charset=UTF-8");
dataToSend.AppendLine("");
dataToSend.AppendLine("<?xml version=\"1.0\"?>");
dataToSend.AppendLine("<!DOCTYPE pap PUBLIC \"-//WAPFORUM//DTD PAP 2.1//EN\" \"http://www.openmobilealliance.org/tech/DTD/pap_2.1.dtd\">");
dataToSend.AppendLine("<pap>");
string myPushId = DateTime.Now.ToFileTime().ToString();
dataToSend.AppendLine("<push-message push-id=" + (char)34 + myPushId + (char)34 + " deliver-before-timestamp=" +
(char)34 + deliverbefore + (char)34 + " source-reference=" + (char)34 + appid + (char)34 + ">");
//dataToSend.AppendLine("<push-message push-id=\"" + myPushId + "\" source-reference=\"" + appid + "\">");
dataToSend.AppendLine("<address address-value=\"" + pushPin + "\"/>");
dataToSend.AppendLine("<quality-of-service delivery-method=\"unconfirmed\"/>");
dataToSend.AppendLine("</push-message>");
dataToSend.AppendLine("</pap>");
dataToSend.AppendLine("--" + Boundary);
dataToSend.AppendLine("Content-Type: text/plain");
dataToSend.AppendLine("Push-Message-ID: " + myPushId);
dataToSend.AppendLine("");
dataToSend.AppendLine(pushedMessage);
dataToSend.AppendLine("--" + Boundary + "--");
dataToSend.AppendLine("");
byte[] bytes = Encoding.ASCII.GetBytes(dataToSend.ToString());
String httpURL = "https://cpxxxx.pushapi.eval.blackberry.com/mss/PD_pushRequest";
WebRequest tRequest;
tRequest = WebRequest.Create(httpURL);
tRequest.Method = "POST";
tRequest.Credentials = new NetworkCredential(appid, password);
tRequest.PreAuthenticate = true;
tRequest.ContentType = "multipart/related; boundary=" + Boundary + "; type=application/xml";
tRequest.ContentLength = bytes.Length;
string rawCredentials = string.Format("{0}:{1}", appid, password);
tRequest.Headers.Add("Authorization",string.Format("Basic {0}",
Convert.ToBase64String(Encoding.UTF8.GetBytes(rawCredentials))));
SetBasicAuthHeader(tRequest, appid, password);
Stream dataStream = tRequest.GetRequestStream();
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();
WebResponse tResponse = tRequest.GetResponse();
dataStream = tResponse.GetResponseStream();
StreamReader tReader = new StreamReader(dataStream);
String sResponseFromServer = tReader.ReadToEnd();
tReader.Close();
dataStream.Close();
tResponse.Close();
}