【发布时间】:2014-05-25 08:27:40
【问题描述】:
我有一个从 android 移动应用程序调用的网络服务 .asmx。它返回一个随机数给安卓应用程序,并使用短信发送相同的数字。
我的问题是有时 Web 服务在同一时间执行多次并返回相同的随机数。所以短信在一个请求中发送了不止一次。
我有两个文件,一个是我从我的应用程序 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.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;
/**/
}
}
}
谢谢
【问题讨论】:
-
请将代码添加到您的问题中。从目前提供的信息中几乎不可能诊断出来。
-
这是不是 WCF。 ASMX 是遗留技术(它是在 .NET 中执行 SOAP Web 服务的 pre-WCF 方式),不应使用。无论如何,ASMX != WCF。我已经相应地更新了你的标签。
-
感谢您提供的信息 我刚收到代码,我对 .net Web 服务不太熟悉。有没有一种方法可以修复它而无需重写?
-
调用代码在哪里。看来我的POV有问题。
-
网络服务是从安卓应用中调用的。如果有多个请求,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/24 06:41: 48 - 用户:610410 - 随机:126985
标签: asp.net web-services asmx