如何使以下操作方法线程安全?

时间:2016-06-02 16:58:24

标签: c# asp.net-mvc-4 thread-safety

以下两个链接访问相同的操作方法:

http://stage.bullydog.com/Products/accessories/podmounthttp://stage.sctflash.com/Products/accessories/podmount

我使用Request.Url.Host来确定我想从数据库返回的产品品牌。当我首先访问http://stage.bullydog.com/Products/accessories/podmount时,Request.Url.Host包含值stage.bullydog.com,但如果我转到http://stage.sctflash.com/Products/accessories/podmountRequest.Url.Host可能包含stage.sctflash.com或者它可能包含stage.bullydog.com

调用的操作方法是:

public ActionResult GetAccessoriesByType(RenderModel model, string id)
    {
        Common _common = new Common();
        string brand = Request.Url != null ? _common.GetProductBrand() : BrandType.SCT;

        var productSearchResultsModel = new ProductSearchResultsModel
        {
            Accessories = _accessoryRepository.GetAccessoriesByType(id, brand)
        };

        return View("~/Views/accessories.cshtml", productSearchResultsModel);
    }

获得该品牌的代码是:

public class Common
{
    public string GetProductBrand()
    {
        var host = HttpContext.Current.Request.Url.Host;

        if (host.Contains("sctflash"))
            return BrandType.SCT;

        if (host.Contains("bigrig") || host.Contains("bigrigs"))
            return BrandType.BigRig;

        if (host.Contains("bullydog"))
            return BrandType.BullyDog;

        return BrandType.SCT;
    }
}

当从两个不同的主机访问相同的操作方法时,如何确保Request.Url.Host包含正确的主机?

如果您转到http://stage.bullydog.com/Products/accessories/podmount然后转到http://stage.sctflash.com/Products/accessories/podmount并刷新其中任何一个,您可以看到这一点,徽标应该更改,这意味着Request.Url.Host返回的值不正确

此外,GetProductBrand可以是静态的,在这种情况下仍然是线程安全的吗?

1 个答案:

答案 0 :(得分:0)

访问其他网站的原因是带回一个网站内容而Request.Url.Host有其他网站信息是因为我在控制器顶部声明了OutPutCache[Duration=60]。如果我等待60秒然后刷新,则每个网站的正确数据将返回。一旦我从控制器中删除了它,一切都按预期工作。