asp.net web服务执行了多次
我有一个web服务.asmx,我从android移动应用程序调用它。它向android应用程序返回一个随机数,并使用sms发送相同的数字 我的问题是,有时web服务在同一时间执行多次,并返回相同的随机数。因此,sms会在一个请求中多次发送 我有两个文件,一个是我从我的应用程序getRandomNumber.asmx调用的文件,另一个是getRandomNumber.cs生成号码的文件,保存到数据库并通过短信发送 所以我在两个文件中都放了一个日志文件,然后等待副本显示 这是我用来跟踪此问题的日志文件: 时间:2014/05/24 06:41:46-用户:610410-随机:进入 时间:2014/05/24 06:41:46-用户:610410-随机:进入 时间:2014/05/24 06:41:46-用户:610410-随机:进入 时间:2014/05/24 06:41:46-用户:610410-随机:进入 时间:2014/05/24 06:41:49-用户:610410-随机:853967 时间:2014/05/24 06:41:49-用户:610410-随机:853967 时间:2014/05/24 06:41:49-用户:610410-随机:853967 时间:2014/05/24 06:41:49-用户:610410-随机:853967 原因是什么,如何解决 更新:添加代码 getRandomNumber.asmx.csasp.net web服务执行了多次,asp.net,web-services,asmx,Asp.net,Web Services,Asmx,我有一个web服务.asmx,我从android移动应用程序调用它。它向android应用程序返回一个随机数,并使用sms发送相同的数字 我的问题是,有时web服务在同一时间执行多次,并返回相同的随机数。因此,sms会在一个请求中多次发送 我有两个文件,一个是我从我的应用程序getRandomNumber.asmx调用的文件,另一个是getRandomNumber.cs生成号码的文件,保存到数据库并通过短信发送 所以我在两个文件中都放了一个日志文件,然后等待副本显示 这是我用来跟踪此问题的日志文
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Script.Services;
using System.Web.Script.Serialization;
using OracleDataAccessLayer;
namespace MobileWebServices
{
[WebService(Namespace = "http://www.example.com")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class getRandomNumber : System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public string sendRandomNumber(int UserNumber)
{
Logger.logError("Time: " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " - user: " + UserNumber + " - random: Going IN");
return Newtonsoft.Json.JsonConvert.SerializeObject(new getRandomNumber().sendRandomNumber(UserNumber));
}
}
}
getRandomNumber.cs
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.IO;
namespace OracleDataAccessLayer
{
public class getRandomNumber : OracleDataAccessLayer.MobileDataAccess.OracleCommandLibrary
{
string sql = "";
public getRandomNumber() { }
string GeneratePasscode(int PasscodeLength)
{
string _allowedChars = "123456789";
Random randNum = new Random();
char[] chars = new char[PasscodeLength];
int allowedCharCount = _allowedChars.Length;
for (int i = 0; i < PasscodeLength; i++)
{
chars[i] = _allowedChars[(int)((_allowedChars.Length) * randNum.NextDouble())];
}
return new string(chars).PadRight(PasscodeLength, '0').ToString();
}
public string sendRandomNumber(int parUserNumber)
{
string random = "0";
string mobile="";
try
{
string randomNum = GeneratePasscode(6);
Logger.logError("Time: " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + " - user: " + parUserNumber + " - random: " + randomNum);
//select the mobile number and the language
sql = "SELECT C.COUNTRY_LANG, MOBILE " +
"FROM COUNTRY_MASTER_TABLE C " +
"JOIN USER_REG_MASTER U ON " +
"C.COUNTRY_CODE = U.NATIONALITY_NO " +
"WHERE U.UNO = " + parUserNumber;
DataTable lang = Retrievedata(sql);
if (lang.Rows.Count > 0)
{
sql = "INSERT INTO SMS_SEND " +
"(SMS_ID, USER_NUMBER, SMS_DATE, RANDOM, DEVICE_TYPE) VALUES " +
"(SEQ_RANDOM.NEXTVAL, " + parUSERNumber + ", SYSDATE, " + randomNum + ", 1)";
if (ExecuteTransactions(sql) > 0)
{
mobile = lang.Rows[0].ItemArray[1].ToString();
// check the lang Arabic, Non Arabic
// if arabic convert to hex
if (lang.Rows[0].ItemArray[0].ToString() == "A")
{
messageOrg = "الرجاء استخدام الرمز " + randomNum;
Byte[] stringBytes = System.Text.Encoding.UTF8.GetBytes(messageOrg);
StringBuilder sbBytes = new StringBuilder(stringBytes.Length * 2);
foreach (byte bb in stringBytes)
{
sbBytes.AppendFormat("%{0:X2}", bb);
}
message = sbBytes.ToString();
messageHex = message;
}
else
{
// If english do nothing
messageOrg = "Please use this code: " + randomNum;
message = "Please use this code: " + randomNum;
}
// add the message and mobile number to SMS service provider URL and create HttpWebRequest
string url = "http://www.example.com/Send.aspx?MOBILENO=" + mobile + "&MESSAGE=" + message + "&rest of prams";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
// execute request and get response back
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
Stream dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
smsSequence = reader.ReadToEnd();
reader.Close();
dataStream.Close();
}
// check if success get the response and check id number and insert into SMS_SENTBOX for logging
int success = 0;
if (smsSequence.Substring(0, 3) == "+OK")
//if (Int32.TryParse(smsSequence.Substring(7, smsSequence.Length - 7), out success))
{
random = randomNum;
sql = "INSERT INTO SMS_SENTBOX " +
"(SMS_SENT_SEQUENCE, USER_NUMBER, EVENT_DATE, EVENT_TIME, USER_MOBILE, EVENT_TYPE, SENT_DATE, SMS_TEXT, SMS_TEXT_DUMP)" +
"VALUES " +
"(1, " + parUserNumber + ", SYSDATE, TO_CHAR(SYSDATE, 'HHMI'), " + mobile + ", 'random', SYSDATE, '" + messageOrg + "', '" + messageHex + "')";
try
{
ExecuteTransactions(sql);
}
catch (Exception e)
{
}
}
}
}
}
catch (Exception e)
{
Logger.logError(e.ToString() + "\n");
throw e;
}
return random;
/**/
}
}
}
谢谢从您的描述中,我不太明白您是否有一个问题相同的随机数生成多次还是两个问题相同的随机数和请求发送多次 无论如何,Microsoft的文档中描述了您的问题的来源: 默认种子值源自系统时钟,具有有限的 决议因此,在中创建的不同随机对象 通过调用默认构造函数关闭继承将具有 相同的默认种子值,因此将产生相同的 随机数的集合 要修复此问题,请创建一个Random的静态实例:
请将代码添加到您的问题中。根据目前提供的信息几乎不可能对其进行诊断。这不是WCF。ASMX是遗留技术,它是在.NET中使用WCF之前的SOAP web服务方式,不应使用。无论如何,ASMX!=WCF。我已经相应地更新了您的标记。感谢您提供的信息,我刚刚收到代码,而且我对.net web服务不太熟悉。有没有一种方法可以在不需要重写的情况下修复它?调用代码在哪里。我的POV似乎有问题。web服务是从android应用程序调用的。如果有多个请求,web服务应返回不同的随机数,但不相同,日志文件如下:2014/05/24 06:41:46-用户:610410-随机:进入时间:2014/05/24 06:41:47-用户:610410-随机:753889时间:2014/05/24 06:41:47-用户:610410-随机:进入时间:2014/05/2406:41:48-用户:610410-随机:126985我的问题是我向web服务发送一个请求,它被执行多次,生成相同的随机数,多次将其保存到数据库,并通过sms多次发送。我将随机更改为静态,并对其进行测试。谢谢,每个请求执行一次。谢谢。问题出在android方面,但你的回答帮我解决了
static Random random = new Random();
....
string GeneratePasscode(int PasscodeLength)
{
string _allowedChars = "123456789";
char[] chars = new char[PasscodeLength];
int allowedCharCount = _allowedChars.Length;
for (int i = 0; i < PasscodeLength; i++)
{
chars[i] = _allowedChars[(int)((_allowedChars.Length) * random.NextDouble())];
}
return new string(chars).PadRight(PasscodeLength, '0').ToString();
}