使用javascript(JQuery Request)将通知推送到wp8

本文关键字:通知 wp8 javascript JQuery Request 使用 | 更新日期: 2023-09-27 18:00:20

所以我要做的是使用javascript将通知推送到windows8应用程序。

所以在查看了这个网站之后,这是我发现的唯一有用的网站。

http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202977(v=vs.105).aspx

我理解以下内容:

1-你需要开发一个应用程序,请求推送通知服务URI,然后与推送客户端服务共享。

(这个应用程序的代码不需要任何东西,因为你只需从上面的链接复制它)

2-您需要使用推送客户端服务发送通知(原始通知)

(问题出现在这里:))

该代码是针对.NET文件的问题,我对此并不熟悉。我尝试将代码从.NET转换为HTML和.JS,在那里我将向给定的URI发送ajax请求。

然而,这给了我一个有线错误,不幸的是,我找不到使用.JS 发送通知的例子

这是原始代码,它基本上定义了一个简单的表单,将请求发送到URI。这与我使用JQueryAjax请求发送的代码之间的唯一区别

原始代码

HTML

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SendRaw.aspx.cs" Inherits="SendRaw.SendRaw" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
   <div>
    <br />
    Enter URI:</div>
<asp:TextBox ID="TextBoxUri" runat="server" Width="666px"></asp:TextBox>
<br />
<br />
Enter Value 1:<br />
<asp:TextBox ID="TextBoxValue1" runat="server"></asp:TextBox>
<br />
<br />
Enter Value 2:<br />
<asp:TextBox ID="TextBoxValue2" runat="server"></asp:TextBox>
<br />
<br />
<br />
<asp:Button ID="ButtonSendRaw" runat="server" onclick="ButtonSendRaw_Click" 
    Text="Send Raw Notification" />
<br />
<br />
Response:<br />
<asp:TextBox ID="TextBoxResponse" runat="server" Height="78px" Width="199px"></asp:TextBox>
</form>

C#(.NET)

 using System.Net;
 using System.IO;
 using System.Text;

C#(.NET)

protected void ButtonSendRaw_Click(object sender, EventArgs e)
    {
        try
        {
            // Get the URI that the Microsoft Push Notification Service returns to the push client when creating a notification channel.
            // Normally, a web service would listen for URIs coming from the web client and maintain a list of URIs to send
            // notifications out to.
            string subscriptionUri = TextBoxUri.Text.ToString();

            HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(subscriptionUri);
            // Create an HTTPWebRequest that posts the raw notification to the Microsoft Push Notification Service.
            // HTTP POST is the only method allowed to send the notification.
            sendNotificationRequest.Method = "POST";
            // Create the raw message.
            string rawMessage = "<?xml version='"1.0'" encoding='"utf-8'"?>" +
            "<root>" +
                "<Value1>" + TextBoxValue1.Text.ToString() + "<Value1>" +
                "<Value2>" + TextBoxValue2.Text.ToString() + "<Value2>" +
            "</root>";
            // Set the notification payload to send.
            byte[] notificationMessage = Encoding.Default.GetBytes(rawMessage);
            // Set the web request content length.
            sendNotificationRequest.ContentLength = notificationMessage.Length;
            sendNotificationRequest.ContentType = "text/xml";
            sendNotificationRequest.Headers.Add("X-NotificationClass", "3");

            using (Stream requestStream = sendNotificationRequest.GetRequestStream())
            {
                requestStream.Write(notificationMessage, 0, notificationMessage.Length);
            }
            // Send the notification and get the response.
            HttpWebResponse response = (HttpWebResponse)sendNotificationRequest.GetResponse();
            string notificationStatus = response.Headers["X-NotificationStatus"];
            string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];
            string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];
            // Display the response from the Microsoft Push Notification Service.  
            // Normally, error handling code would be here. In the real world, because data connections are not always available,
            // notifications may need to be throttled back if the device cannot be reached.
            TextBoxResponse.Text = notificationStatus + " | " + deviceConnectionStatus + " | " + notificationChannelStatus;
        }
        catch (Exception ex)
        {
            TextBoxResponse.Text = "Exception caught sending update: " + ex.ToString();
        }

MY代码

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1">
    <script src="jquery-2.0.3.min.js"></script>
   <script>
     $(document).ready(function(e) {
        $('#ButtonSendRaw').click(function(){
        console.log("Button Pressed");
        var subscriptionUri = $('#TextBoxUri').val();
        var textbox1 = $('#TextBoxValue1').val();
        var textbox2 = $('#TextBoxValue2').val();
        var rawMessage = "<?xml version='"1.0'" encoding='"utf-8'"?>" +
        "<root>" +
            "<Value1>" + textbox1 + "<Value1>" +
            "<Value2>" + textbox2 + "<Value2>" +
        "</root>";
        console.log("Sending Data");
        $.ajax({
            url: subscriptionUri,
            type: "POST",
            data: rawMessage,
            contentType:"text/xml",
            success: function(response) {
               console.log('Sucess');
               console.log("login| Response");
               console.log(response);
              },
             error: function (xhr, ajaxOptions, thrownError) {
                    console.log(xhr.status);
                    console.log(thrownError);
            }
            });
        });
    });

</script>
    </head>
    <body>
    Enter URI:<input type="text" ID="TextBoxUri" Width="666px" /> <br />
Enter Value 1: <input type="text" ID="TextBoxValue1" /> <br />
Enter Value 2: <input ID="TextBoxValue2" /> <br />
<button id="ButtonSendRaw">Sending Data</button> <br />
Response: <input ID="TextBoxResponse" Height="78px" Width="199px" /> <br />
  </body>
  </html>

我从中得到的错误是:

    405 (Method Not Allowed)

其中方法自动设置为OPTIONS,尽管我正在发送POST请求

任何建议,请提前感谢:)

使用javascript(JQuery Request)将通知推送到wp8

我假设subscriptionuri值是一个URI,其域与包含JQuery代码页面的网站不同。(例如,您的网站位于www.mywebsite.com,subscriptionuri为www.microsoft.com/api/push)

在这种情况下,浏览器将尝试发出跨域请求。在使用跨域请求(如跨站点请求伪造或跨站点脚本)时,需要注意安全问题。请参阅此处了解更多信息。

通常,现代浏览器只允许Ajax调用与HTML页面位于同一域中的uri。如果uri在其他域中,则浏览器不会进行直接调用。相反,它将尝试发出CORS请求。

跨源资源共享(CORS)规范为web应用程序开发人员提供了一种机制,使其能够使用浏览器支持的机制,以安全的方式向另一个域发出XmlHttpRequest。CORS机制通过向跨域HTTP请求和响应添加HTTP头来工作。这些标头指示请求的来源,服务器必须通过响应中的标头指示是否将资源提供给该来源。这种报头交换使CORS成为一种安全机制。服务器必须支持CORS,并表明提出请求的客户端的域可以这样做。这种机制的美妙之处在于,它由浏览器自动处理,web应用程序开发人员不需要关心其细节。

CORS中有不同的流程,如简单请求、预许可请求和认证请求。您试图提出的请求将属于预点燃请求的类别,因为您的请求正文的内容类型不是text/plain、application/x-www-form-urlencoded或multipart/form数据。

OPTIONS http://otherdomain.com/some-resource/ HTTP/1.1
Origin: http://mydomain.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-Foo

这将从服务器接收以下响应(如果服务器上启用了CORS),指示允许POST操作

HTTP/1.1 200 OK
Access-Control-Allow-Origin: http://mydomain.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: X-Foo
Access-Control-Max-Age: 3600

一旦收到此响应,您的浏览器将进行实际的POST。

PUT http://otherdomain.com/some-resource/ HTTP/1.1
Content-Type: application/xml; charset=UTF-8
X-Foo: bar

此过程确保未启用CORS的服务器不会在浏览器由于缺少适当的Access Control Allow Origin标头而禁止响应之前处理可能会作为副作用修改服务器资源的请求。

在您的情况下,由于您的服务器未启用CORS,您看到的是OPTIONS调用,但不是随后的POST。解决此问题的最简单方法是在服务器上启用CORS,这样服务器就可以在响应中发送必要的标头。希望这能有所帮助!