0

设置

我们有一个托管在 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;
    }



}

}

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

我们希望服务只返回给定请求的数据。有谁知道怎么回事???

4

1 回答 1

2

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

于 2013-10-04T19:56:28.090 回答