【问题标题】:asp.net web service executed more than one timeasp.net web 服务执行了不止一次
【发布时间】: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


【解决方案1】:

从你的描述来看,我不太明白你是一个问题(同一个随机数产生多次)还是两个问题(同一个随机数,请求被多次发送)。

无论如何,你的问题的根源在微软关于Random() constructor的文档中有描述:

默认种子值来自系统时钟,具有有限的 解析度。结果,在 通过调用默认构造函数的紧密继承将具有 相同的默认种子值,因此,将产生相同的 随机数集。

要修复它,请创建 Random 的单个静态实例:

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

【讨论】:

  • 我的问题是我向网络服务发送一个请求,它被执行多次,生成相同的随机数,多次保存到数据库并通过短信多次发送。我将随机更改为静态并进行测试。谢谢
  • 假设每个请求执行一次。
  • 谢谢。问题出在android方面,但您的回答帮助我弄清楚了
猜你喜欢
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多