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

时间:2013-10-04 19:52:55

标签: c# asp.net sql-server-2008 asp.net-web-api

设置

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

问题

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

C#服务代码

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 个答案:

答案 0 :(得分:2)

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