C# Apple有效收据验证(远程主机强制关闭了现有连接)

C# Apple有效收据验证(远程主机强制关闭了现有连接),c#,ios,web-services,post,receipt-validation,C#,Ios,Web Services,Post,Receipt Validation,我在验证沙盒收据时遇到问题。设备将收据发送到my Azure应用程序服务,该服务向Apple收据服务器发出POST请求。但是,在大约50%的请求中,我得到了一个错误回复: System.Net.WebException: The SSL connection could not be established, see inner exception. Unable to read data from the transport connection: An existing connection

我在验证沙盒收据时遇到问题。设备将收据发送到my Azure应用程序服务,该服务向Apple收据服务器发出POST请求。但是,在大约50%的请求中,我得到了一个错误回复:

System.Net.WebException: The SSL connection could not be established, see inner exception. Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host
另外50%的工作正常

C#代码:

[HttpPost(“{isSandbox}”)]
公共bool Post(bool isSandbox,[FromBody]我的收据我的收据)
{
尝试
{
var json=new JObject(新的JProperty(“收据数据”,myReceipt.ReceiptString),
新的JProperty(“密码”,myReceipt.password),
新JProperty(“排除旧事务”,“true”)。ToString();
ascienceoding ascii=新的ascienceoding();
byte[]postBytes=Encoding.UTF8.GetBytes(json);
变量url=”https://buy.itunes.apple.com/verifyReceipt";
如果(isSandbox)
{
url=”https://sandbox.itunes.apple.com/verifyReceipt";
}
var request=WebRequest.Create(url);
request.Method=“POST”;
request.ContentType=“application/json”;
request.ContentLength=postBytes.Length;
使用(var stream=request.GetRequestStream())
{
stream.Write(postBytes,0,postBytes.Length);
stream.Flush();
}
var sendresponse=request.GetResponse();
字符串sendresponsetext=“”;
使用(var streamReader=newstreamreader(sendresponse.GetResponseStream()))
{
sendresponsetext=streamReader.ReadToEnd().Trim();
}
var responseObject=JsonConvert.DeserializeObject(sendresponsetext);
if(responseObject.Latest_receivement_info[0]。Expires_date==null)
{
返回false;
}
DateTime expireDate=Convert.ToDateTime(responseObject.Latest_received_info[0]。Expires_date.Replace(“Etc/GMT”);
如果(expireDate>=DateTime.Now | | responseObject.Latest(最新)收据(信息[0]),是否(试用)期间==“true”)
{
//用户有溢价
返回true;
}
返回false;
}
捕获(异常错误)
{
遥测跟踪事件(“例外:+错误);
返回false;
}
}
我获得此代码的大部分原因是:


问题是对我来说,它不是100%可靠的。你知道为什么会这样吗?这是否只发生在沙盒验证中?

我今天遇到了相同的错误(在php请求中)。但是1小时前我在沙盒请求中收到一个404错误。。。可能是苹果服务器出错。这已经发生了好几个月了。我正在使用Azure函数进行收据验证,现在大多数时候我都会收到SSL错误。@MuSoundiX您找到解决方案了吗?我们有同样的问题。嗯,嗯。。。我是这样做的:如果我的API给出了这个错误,我将返回一个不同的结果。然后应用程序在本地进行验证。在我看来,这是唯一的解决办法。因此,我将我的应用构建上传到应用商店。我已经在我的API中加入了记录器,以查看苹果生产服务器上是否也存在此错误。目前还没有。所以目前,它在生产上100%有效,但在沙盒验证中不起作用。@MuSoundiX这是我的假设。但如此重要的服务,如应用内购买,最终归结为客户、您甚至苹果的钱,在沙箱中的表现不应该有所不同。因为一旦产品不再免费,错误接受就会大大减少。
[HttpPost("{isSandbox}")]
        public bool Post(bool isSandbox, [FromBody] myReceipt myReceipt)
        {
            try
            {
                var json = new JObject(new JProperty("receipt-data", myReceipt.ReceiptString),
                           new JProperty("password", myReceipt.Password),
                           new JProperty("exclude-old-transactions", "true")).ToString();

                ASCIIEncoding ascii = new ASCIIEncoding();
                byte[] postBytes = Encoding.UTF8.GetBytes(json);

                var url = "https://buy.itunes.apple.com/verifyReceipt";
                if(isSandbox)
                {
                    url = "https://sandbox.itunes.apple.com/verifyReceipt";
                }
                var request = WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "application/json";
                request.ContentLength = postBytes.Length;

                using (var stream = request.GetRequestStream())
                {
                    stream.Write(postBytes, 0, postBytes.Length);
                    stream.Flush();
                }

                var sendresponse = request.GetResponse();

                string sendresponsetext = "";
                using (var streamReader = new StreamReader(sendresponse.GetResponseStream()))
                {
                    sendresponsetext = streamReader.ReadToEnd().Trim();
                }
                var responseObject = JsonConvert.DeserializeObject<responseBody>(sendresponsetext);
                if (responseObject.Latest_receipt_info[0].Expires_date == null)
                {
                    return false;
                }
                DateTime expireDate = Convert.ToDateTime(responseObject.Latest_receipt_info[0].Expires_date.Replace(" Etc/GMT", ""));
                if (expireDate >= DateTime.Now || responseObject.Latest_receipt_info[0].Is_trial_period == "true")
                {
                    // User has premium
                    return true;
                }
                return false;
            }
            catch (Exception error)
            {
                telemetry.TrackEvent("Exeption: " + error);
                return false;
            }
        }