gpt4 book ai didi

asp.net - 为什么在 WebAPI 中访问 session 状态和 HttpContext 被认为是糟糕的设计?

转载 作者:行者123 更新时间:2023-12-01 10:50:09 25 4
gpt4 key购买 nike

我有几个 .asmx Web 服务想要升级到 WebAPI。这些网络服务看起来有点像这样:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class TheWebService : System.Web.Services.WebService {

[WebMethod(EnableSession = true)]
public string SomeMethod(string SomeInput)
{
MySessionModel TheSession = HttpContext.Current.Session["UserSession"] as MySessionModel;

return SomeClass.SomeMethod(SomeInput, TheSession);
}
}

基本上,我有一个单页应用程序。我使用 Forms Auth 登录并将用户重定向到他们的“个人资料”,然后,从该页面,应用程序使用 Web 服务与服务器进行通信。 Web 服务仅返回原始字符串,因此我不需要在 Web 服务级别进行序列化。目前,该应用程序托管在 IIS 中,很快我将把它部署到 azure 中。

我在网上浏览了一下,有几篇文章表明使用 session 状态和 HttpContext 是糟糕的设计。为什么在这种情况下使用 HttpCurrent 和 session 状态是一个坏主意?

最佳答案

使用 ASP.NET Session 并没有什么本质上的错误,只要您不将其用作任何旧数据的包罗万象的篮子即可。例如,购物车不属于 session :它们属于购物车持久性组件。

另外,我怀疑这个问题上的 Azure 标签的原因,如果您在负载平衡的环境(例如 Azure 云服务)中运行,则需要使用外部 session 提供程序(例如 SQL 数据库或共享缓存。当用户在具有不同 session 副本的不同服务器之间切换时,使用进程内 session 提供程序(默认)将导致非常奇怪、通常无法重现的错误。

对于 HttpContext.Current,对于 Web API,控制反转、依赖注入(inject)和简单的可测试性等都很重要。该服务的干净、可测试的 Web API 版本可能如下所示:

public class TheWebService : ApiController {

private readonly IUserSession _userSession;

public TheWebService(IUserSession userSession)
{
_userSession = userSession;
}
public string SomeMethod(string SomeInput)
{
MySessionModel TheSession = _userSession.Get();
return SomeClass.SomeMethod(SomeInput, TheSession);
}
}

public interface IUserSession
{
MySessionModel Get();
}

您仍然可以在这样的类中使用 HttpContext.Current.Session["UserSession"]:

public class CurrentContextUserSession : IUserSession
{
public MySessionModel Get()
{
return HttpContext.Current.Session["UserSession"] as MySessionModel;
}
}

然后,您可以使用 Unity 或 Ninject 等 IoC 容器将 CurrentContextUserSession 设置为 IUserSession 的实现,以便 Web API 在构造 TheWebService 实例时使用。但是,当您编写测试时,您可以使用 IUserSession 的模拟或 stub 实现,它不依赖于 HttpContext.Current

关于asp.net - 为什么在 WebAPI 中访问 session 状态和 HttpContext 被认为是糟糕的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21262633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com