gpt4 book ai didi

c# - 使用 javascript (JQuery 请求) 将通知推送到 wp8

转载 作者:行者123 更新时间:2023-12-03 12:46:32 25 4
gpt4 key购买 nike

所以我想做的是使用 JavaScript 将通知推送到 Windows 8 应用程序。

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

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

我理解了以下内容:

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

(此应用程序的代码不需要任何内容​​,您只需从上面的链接复制它即可)

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

(这里出现了问题:))

代码适用于我不熟悉的.NET 文件的问题。我尝试将代码从 .NET 转换为 HTML 和 .JS,我将在其中将 ajax 请求发送到给定的 URI。

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

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

原始代码

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

我的代码

<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)

虽然我正在发送 POST 请求,但方法自动设置为 OPTIONS

任何建议,提前致谢:)

最佳答案

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

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

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

跨源资源共享 (CORS) 规范为 Web 应用程序开发人员提供了一种机制,使其拥有浏览器支持的机制,以安全的方式向另一个域发出 XmlHttpRequest。 CORS 机制的工作原理是在跨域 HTTP 请求和响应中添加 HTTP header 。这些 header 指示请求的来源,服务器必须通过响应中的 header 指示是否将向该来源提供资源。这种 header 交换使 CORS 成为一种安全机制。服务器必须支持 CORS 并指示发出请求的客户端的域允许这样做。这种机制的优点在于它由浏览器自动处理,Web 应用程序开发人员无需关心其细节。

CORS 中有不同的流程,例如简单请求、预检请求和凭据请求。您尝试发出的请求将属于预检请求类别,因为您的请求正文具有除 text/plain、application/x-www-form-urlencoded 或 multipart/form-data 之外的 Content-Type。

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 而不允许响应之前修改服务器资源的请求(这是一种副作用) header 。

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

关于c# - 使用 javascript (JQuery 请求) 将通知推送到 wp8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23327480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com