首页 文章

并发.net web api服务调用返回重复数据

提问于
浏览
0

The setup

我们在IIS 7.5上托管了一个Web应用程序,它使用.net web api rest服务来简化SQL Server 2008数据库 . 服务控制器调用存储过程来读取数据 .

The problem

当对同一Web服务发出并发请求时,我们会间歇性地看到重复的结果,有时会将其他进程结果返回给浏览器 .

C# service code

namespace ImageApp_REST_Services.Repositories {
public class ImageLinkRepository : IImageLinkRepository
{

    private List<ImageLink> ImageLinks
    {
        get;
        set;

    }

    public IEnumerable<ImageLink> Get(String userId)
    {

        ImageLinks = new List<ImageLink>();

        using (var cnnSQL = new SqlConnection(...))
        {

            // opend connection to DB
            cnnSQL.Open();

            try
            {

                SqlCommand cmmSQL = new SqlCommand("nVision_select_lcimagelinks_sp", cnnSQL);
                cmmSQL.CommandType = System.Data.CommandType.StoredProcedure;

                SqlParameter prmSQL = cmmSQL.Parameters.Add(new SqlParameter
                {
                    ParameterName = "@LCIMGLINKUSERID",
                    Value = userId
                });

                SqlDataReader rdrSQL = cmmSQL.ExecuteReader();

                if (rdrSQL.HasRows)
                {
                    while (rdrSQL.Read())
                    {

                        ImageLinks.Add(new ImageLink
                        {
                            // set new ImageLink object's properties    
                            imageTopicId = DBReader.SQLString(rdrSQL, "LCIMGLINKIMGTOPICID"),
                            id = DBReader.SQLInt(rdrSQL, "LCIMGLINKPK"),
                            recordId = DBReader.SQLString(rdrSQL, "LCIMGLINKRECORDID"),
                            text = DBReader.SQLString(rdrSQL, "LCIMGLINKTEXT"),
                            topicId = DBReader.SQLString(rdrSQL, "LCIMGLINKTOPICID"),
                            topicItem = DBReader.SQLString(rdrSQL, "LCIMGLINKTOPICITEM"),
                            url = DBReader.SQLString(rdrSQL, "LCIMGLINKURL"),
                            user = DBReader.SQLString(rdrSQL, "LCIMGLINKUSERID")
                        });
                    }
                }
            }
            catch (Exception)
            {

            }

        }

        return ImageLinks;
    }



}

}

同样,当多个请求同时命中服务时,我们偶尔会看到返回的重复记录或属于另一个服务调用的记录 .

我们希望服务仅返回给定请求的数据 . 有谁知道什么是错的???

1 回答

  • 2

    ImageLinks 被定义为静态成员吗?如果是,则将在多个线程和Web请求之间共享内容 . 一个线程将覆盖另一个线程的结果 . 远射,但适合你的问题 .

相关问题