如何在以下上下文中从响应中获取规范 ID?
How to get the canonical ids from the response in the following context?
我是 GCM 的新手,我使用以下方法向 GCM 服务器发送消息。
public string SendMessage(string RegistrationID, string Message, string AuthString)
{
//-- Create C2DM Web Request Object --//
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://android.clients.google.com/c2dm/send");
Request.Method = "POST";
Request.KeepAlive = false;
//-- Create Query String --//
NameValueCollection postFieldNameValue = new NameValueCollection();
postFieldNameValue.Add("registration_id", RegistrationID);
postFieldNameValue.Add("collapse_key", "1");
postFieldNameValue.Add("delay_while_idle", "0");
// postFieldNameValue.Add("data.message", Message);
postFieldNameValue.Add("data.payload", Message);
string postData = GetPostStringFrom(postFieldNameValue);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
Request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
Request.ContentLength = byteArray.Length;
Request.Headers.Add(HttpRequestHeader.Authorization, "GoogleLogin auth=" + AuthString);
//-- Delegate Modeling to Validate Server Certificate --//
ServicePointManager.ServerCertificateValidationCallback += delegate(
object
sender,
System.Security.Cryptography.X509Certificates.X509Certificate
pCertificate,
System.Security.Cryptography.X509Certificates.X509Chain pChain,
System.Net.Security.SslPolicyErrors pSSLPolicyErrors)
{
return true;
};
//-- Create Stream to Write Byte Array --//
Stream dataStream = Request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
//-- Post a Message --//
WebResponse Response = Request.GetResponse();
HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode;
if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden))
{
return "Unauthorized - need new token";
}
else if (!ResponseCode.Equals(HttpStatusCode.OK))
{
return "Response from web service isn't OK";
//Console.WriteLine("Response from web service not OK :");
//Console.WriteLine(((HttpWebResponse)Response).StatusDescription);
}
StreamReader Reader = new StreamReader(Response.GetResponseStream());
string responseLine = Reader.ReadLine();
Reader.Close();
return responseLine;
}
在这种情况下,我需要处理规范 ID。我看到下面的代码片段可以在 Java.
中使用
if (result.getMessageId() != null) {
String canonicalRegId = result.getCanonicalRegistrationId();
if (canonicalRegId != null) {
// same device has more than on registration ID: update database
}
} else {
String error = result.getErrorCodeName();
if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
// application has been removed from device - unregister database
}
}
但是我怎样才能在 C# 中实现相同的功能呢?它没有 getCanonicalIds 方法,因为它是我得到的标准网络响应。如何找到规范 ID 并将其从 table 中删除?请指教
规范 ID 是已在不同 ID 下注册的设备的 ID。当您没有这样的 Id 时,canonical_ids 元素将为您提供 0。但是如果它有一个值,那么响应中的 canonical_ids 元素将显示计数。在您的回复中,这些 ID 将显示为 "registration_id"。这些将按照发送请求的顺序排列。因此,如果您的响应字符串的第 3 个和第 4 个元素具有 "registration_ids" 的值,则意味着您在请求中发送的第 3 个和第 4 个元素 ID 不正确。将 table 中的它们替换为响应中 "registration_ids" 中提供的 ID。下面是从 C# 代码中获取这些索引和 ID 的代码。
class Program
{
static void Main(string[] args)
{
List<String> ids = new List<String>();
String json ="{\"multicast_id\": \"xxxxx\",\"success\": 7,\"failure\": 0,\"canonical_ids\": 2,\"results\": [{\"message_id\": \"0:xxx%xxxxx\"}, {\"message_id\": \"0:xxx%xxxxx\"}, {\"registration_id\": \"456\",\"message_id\": \"0:xxx%xxxxx\"}, {\"message_id\": \"0:xxx%xxxxx\"}, {\"message_id\": \"0:xxx%xxxxx\"}, {\"registration_id\": \"123\",\"message_id\": \"0:xxx%xxxxx\"}, {\"message_id\": \"0:xxx%xxxxx\"}]}";
RootObject decryptedMessage = new JavaScriptSerializer().Deserialize<RootObject>(json);
int position = 0;
Dictionary<int, String> canonicalIdsAndIndexes = new Dictionary<int, string>();
foreach (var item in decryptedMessage.results)
{
if (item.registration_id != null)
{
canonicalIdsAndIndexes.Add(position, item.registration_id);
Console.WriteLine("message id: {0}, registrationid: {1}", item.message_id, item.registration_id);
}
position++;
}
Console.ReadLine();
}
}
public class Result
{
public string message_id { get; set; }
public string registration_id { get; set; }
}
public class RootObject
{
public string multicast_id { get; set; }
public int success { get; set; }
public int failure { get; set; }
public int canonical_ids { get; set; }
public List<Result> results { get; set; }
}
我是 GCM 的新手,我使用以下方法向 GCM 服务器发送消息。
public string SendMessage(string RegistrationID, string Message, string AuthString)
{
//-- Create C2DM Web Request Object --//
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://android.clients.google.com/c2dm/send");
Request.Method = "POST";
Request.KeepAlive = false;
//-- Create Query String --//
NameValueCollection postFieldNameValue = new NameValueCollection();
postFieldNameValue.Add("registration_id", RegistrationID);
postFieldNameValue.Add("collapse_key", "1");
postFieldNameValue.Add("delay_while_idle", "0");
// postFieldNameValue.Add("data.message", Message);
postFieldNameValue.Add("data.payload", Message);
string postData = GetPostStringFrom(postFieldNameValue);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
Request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
Request.ContentLength = byteArray.Length;
Request.Headers.Add(HttpRequestHeader.Authorization, "GoogleLogin auth=" + AuthString);
//-- Delegate Modeling to Validate Server Certificate --//
ServicePointManager.ServerCertificateValidationCallback += delegate(
object
sender,
System.Security.Cryptography.X509Certificates.X509Certificate
pCertificate,
System.Security.Cryptography.X509Certificates.X509Chain pChain,
System.Net.Security.SslPolicyErrors pSSLPolicyErrors)
{
return true;
};
//-- Create Stream to Write Byte Array --//
Stream dataStream = Request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
//-- Post a Message --//
WebResponse Response = Request.GetResponse();
HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode;
if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden))
{
return "Unauthorized - need new token";
}
else if (!ResponseCode.Equals(HttpStatusCode.OK))
{
return "Response from web service isn't OK";
//Console.WriteLine("Response from web service not OK :");
//Console.WriteLine(((HttpWebResponse)Response).StatusDescription);
}
StreamReader Reader = new StreamReader(Response.GetResponseStream());
string responseLine = Reader.ReadLine();
Reader.Close();
return responseLine;
}
在这种情况下,我需要处理规范 ID。我看到下面的代码片段可以在 Java.
中使用if (result.getMessageId() != null) {
String canonicalRegId = result.getCanonicalRegistrationId();
if (canonicalRegId != null) {
// same device has more than on registration ID: update database
}
} else {
String error = result.getErrorCodeName();
if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
// application has been removed from device - unregister database
}
}
但是我怎样才能在 C# 中实现相同的功能呢?它没有 getCanonicalIds 方法,因为它是我得到的标准网络响应。如何找到规范 ID 并将其从 table 中删除?请指教
规范 ID 是已在不同 ID 下注册的设备的 ID。当您没有这样的 Id 时,canonical_ids 元素将为您提供 0。但是如果它有一个值,那么响应中的 canonical_ids 元素将显示计数。在您的回复中,这些 ID 将显示为 "registration_id"。这些将按照发送请求的顺序排列。因此,如果您的响应字符串的第 3 个和第 4 个元素具有 "registration_ids" 的值,则意味着您在请求中发送的第 3 个和第 4 个元素 ID 不正确。将 table 中的它们替换为响应中 "registration_ids" 中提供的 ID。下面是从 C# 代码中获取这些索引和 ID 的代码。
class Program
{
static void Main(string[] args)
{
List<String> ids = new List<String>();
String json ="{\"multicast_id\": \"xxxxx\",\"success\": 7,\"failure\": 0,\"canonical_ids\": 2,\"results\": [{\"message_id\": \"0:xxx%xxxxx\"}, {\"message_id\": \"0:xxx%xxxxx\"}, {\"registration_id\": \"456\",\"message_id\": \"0:xxx%xxxxx\"}, {\"message_id\": \"0:xxx%xxxxx\"}, {\"message_id\": \"0:xxx%xxxxx\"}, {\"registration_id\": \"123\",\"message_id\": \"0:xxx%xxxxx\"}, {\"message_id\": \"0:xxx%xxxxx\"}]}";
RootObject decryptedMessage = new JavaScriptSerializer().Deserialize<RootObject>(json);
int position = 0;
Dictionary<int, String> canonicalIdsAndIndexes = new Dictionary<int, string>();
foreach (var item in decryptedMessage.results)
{
if (item.registration_id != null)
{
canonicalIdsAndIndexes.Add(position, item.registration_id);
Console.WriteLine("message id: {0}, registrationid: {1}", item.message_id, item.registration_id);
}
position++;
}
Console.ReadLine();
}
}
public class Result
{
public string message_id { get; set; }
public string registration_id { get; set; }
}
public class RootObject
{
public string multicast_id { get; set; }
public int success { get; set; }
public int failure { get; set; }
public int canonical_ids { get; set; }
public List<Result> results { get; set; }
}