Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
黑莓推送服务的C#服务器端_C#_Asp.net_Blackberry_Push Notification_Push - Fatal编程技术网

黑莓推送服务的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();
}