首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法发送WNS推送通知

无法发送WNS推送通知
EN

Stack Overflow用户
提问于 2018-06-14 23:01:24
回答 1查看 569关注 0票数 0

我使用以下代码向我的应用程序发送推送原始通知。代码取自正式文件中给出的示例。

代码语言:javascript
复制
public string PostToWns(string secret, string sid, string uri, string xml, string notificationType, string contentType)
{
    try
    {
        var accessToken = GetAccessToken(secret, sid);

        byte[] contentInBytes = Encoding.UTF8.GetBytes(xml);

        HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
        request.Method = "POST";
        request.Headers.Add("X-WNS-Type", notificationType);
        request.ContentType = contentType;
        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())
        //                              ^^^^^ This throws an exception ^^^^^
            return webResponse.StatusCode.ToString();
    }

    catch (WebException webException)
    {
        HttpStatusCode status = ((HttpWebResponse)webException.Response).StatusCode;

        if (status == HttpStatusCode.Unauthorized)
        {
            GetAccessToken(secret, sid);
            return PostToWns(uri, xml, secret, sid, notificationType, contentType);
        }
        else if (status == HttpStatusCode.Gone || status == HttpStatusCode.NotFound)
        {
            return "";
        }
        else if (status == HttpStatusCode.NotAcceptable)
        {
            return "";
        }
        else
        {
            string[] debugOutput = {
                                status.ToString(),
                                webException.Response.Headers["X-WNS-Debug-Trace"],
                                webException.Response.Headers["X-WNS-Error-Description"],
                                webException.Response.Headers["X-WNS-Msg-ID"],
                                webException.Response.Headers["X-WNS-Status"]
                            };
            return string.Join(" | ", debugOutput);
        }
    }

    catch (Exception ex)
    {
        return "EXCEPTION: " + ex.Message;
    }
}

// Authorization
[DataContract]
public class OAuthToken
{
    [DataMember(Name = "access_token")]
    public string AccessToken { get; set; }
    [DataMember(Name = "token_type")]
    public string TokenType { get; set; }
}

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

服务器总是返回Unauthorized。但是,我能够获得一个没有问题的令牌,所使用的通道URL就像在官方例子中一样。

整个代码一次执行,因此我怀疑每次令牌过期。

我尝试使用在线工具来检查推送通知是否有效,并且那里也发生了相同的Unauthorized错误。

我必须在某个地方注册WNS吗?我的应用程序已经在商店里了,我有来自网站的ID和密码。我使用这些作为凭证来获取令牌,并且每次都获得令牌。我将此描述为一个相关问题的一部分:正确的WNS证书

有人有什么想法或解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-15 17:46:10

我在另一个问题上找到了一个答案:Windows通知服务:尝试在PHP中创建Toast通知时的401无效令牌

client_id必须是完整的SID (包括协议前缀),client_secret是密码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50867054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档