2
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.IO;
using System.Text;
using System.Security.Authentication;
using System.Net.Security;
using System.Net.Sockets;
using System.Security.Cryptography.X509Certificates;
using Newtonsoft.Json.Linq;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void btnPush_Click(object sender, EventArgs e)
        {
            pushMessage(txtDeviceID.Text.Trim(), txtPayload.Text.Trim());
        }


        public void pushMessage(string deviceID, string Mesaj)
        {

            int port = 2195;
            String hostname = "ssl://gateway.sandbox.push.apple.com:2195";

            String certificatePath = HttpContext.Current.Server.MapPath("PushNotifi.p12");
            X509Certificate2 clientCertificate = new X509Certificate2(System.IO.File.ReadAllBytes(certificatePath), "taxmann");
            X509Certificate2Collection certificatesCollection = new X509Certificate2Collection(clientCertificate);

            TcpClient client = new TcpClient(hostname, port);
            SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null);

            try
            {
                sslStream.AuthenticateAsClient(hostname, certificatesCollection, SslProtocols.Ssl3, false);

                MemoryStream memoryStream = new MemoryStream();
                BinaryWriter writer = new BinaryWriter(memoryStream);
                writer.Write((byte)0);  //The command
                writer.Write((byte)0);  //The first byte of the deviceId length (big-endian first byte)
                writer.Write((byte)32); //The deviceId length (big-endian second byte)

                writer.Write(HexStringToByteArray(deviceID.ToUpper()));
                String payload = "{\"aps\":{\"alert\":{\body\":\"" + Mesaj + "\"},\"badge\":1,\"sound\":\"default\"}}";
                writer.Write((byte)0);
                writer.Write((byte)payload.Length);
                byte[] b1 = System.Text.Encoding.UTF8.GetBytes(payload);
                writer.Write(b1);
                writer.Flush();
                byte[] array = memoryStream.ToArray();
                sslStream.Write(array);
                sslStream.Flush();
                client.Close();
                lblResponse.Text = "Sucess..";
            }
            catch (System.Security.Authentication.AuthenticationException ex)
            {
                client.Close();
                lblResponse.Text = ex.Message;
            }   
            catch (Exception e)
            {
                client.Close();
                lblResponse.Text = e.Message;
            }
        }

        // The following method is invoked by the RemoteCertificateValidationDelegate. 
        public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            if (sslPolicyErrors == SslPolicyErrors.None)
                return true;
            else // Do not allow this client to communicate with unauthenticated servers. 
                return false;
        }

        private static byte[] HexStringToByteArray(String DeviceID)
        {
            //convert Devide token to HEX value.
            byte[] deviceToken = new byte[DeviceID.Length / 2];
            for (int i = 0; i < deviceToken.Length; i++)
                deviceToken[i] = byte.Parse(DeviceID.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber);

            return deviceToken;
        }
    }
}

これは私のコードです。これを実行すると、

SocketExceptionはユーザーコードによって処理されませんでした

オンライン

TcpClient client = new TcpClient(host-name, port);  

グーグルsystem.net.sockets.socketexceptionnot recognize ssl://gateway.sandbox.push.apple.com:2195 host name

どうすればこれを修正できますか?

基本的に、このコードはプッシュ通知をiPhoneアプリケーションに送信するためのものです。

localhost通知を送信するためのサーバーとして 使用しています。

4

1 に答える 1

0

問題はあなたの文字列だと思いますhostname

int port = 2195;
String hostname = "ssl://gateway.sandbox.push.apple.com:2195";
TcpClient client = new TcpClient(hostname, port);

ポート値(2195)は別個のコンストラクターパラメーターであるため、ホスト名パラメーターで渡す必要はないと思います。

また、プロトコル(例)はホスト名ssl://の一部であってはなりません。これがSSLであることを.NETに通知します。SslStream

スタックオーバーフローに関するこの同様の質問を見ると、次のようなものを使用していることがわかります。

int port = 2195;
String hostname = "gateway.sandbox.push.apple.com";
TcpClient client = new TcpClient(hostname, port);

PSこのテーマに関するあなたの最初の質問では、あなたもそれを正しく持っていたと思います

于 2013-03-09T09:18:15.523 に答える