小编Mar*_*ark的帖子

在MVC中是否有最佳实践和推荐的Session变量替代方法

好吧,首先,在任何人试图确定这是一个"重复"的问题之前; 我已经回顾了关于类似问题的大部分关于SO的帖子,但即使结合所有已经说过的话,我仍然有点处于最终的困境,或者我应该就此达成一致意见.

然而,我可以说我(基于帖子)最终确定答案是基于要求的范围.但即使考虑到这一点,我的意见似乎也太多了,我无法决定如何处理这个问题.

我的直接要求是我需要在许多视图中保持来自1个控制器的可变数据.更具体地说,我有一个控制器和相应的视图来处理购物车项目计数,我想在多个视图中保留这些数据.我认为_layout视图是最合乎逻辑的选择.

现在我已成功完成此任务,方法是将值赋给从我的_layout视图中检索的Session变量; 因此,即使用户要浏览网站内的任何位置,购物车中的商品数量仍将持续,直到他们离开网站或完成结帐; 在这种情况下,变量将在代码中清除.

我读过的帖子似乎偏向于远离Session变量而支持Cookie并将数据存储在数据库中; 或者声明为了我建议使用它们的目的,Session变量可以很好地使用.

我读过的另一件事表明,如果网站上的流量很高,会话变量可能会阻碍整体性能,因为信息存储在服务器上.

我个人无法证明在数据库中存储此类信息并随后访问数据库是合理的,因为我认为这也会影响网站性能,并且对于临时数据的存储似乎有点过分.TempData,ViewData和ViewBag不能用于持久保存数据,因此它们不是IMO要求的逻辑选择.

如果还有另一个非常适合Session变量的替代品(这对我有用),我想知道它是什么.

在提供最佳建议方面似乎相互矛盾的2个帖子让我有些困惑.

缺点:避免在ASP.NET MVC中使用会话状态是一种好习惯吗?如果是,为什么以及如何?

优点:仍然可以在ASP.NET mvc中使用Session变量,或者对某些东西有更好的选择(比如购物车)

似乎这个问题(虽然以许多不同的变体形式呈现)没有明确的答案,我可以得出结论.

如果有一种更优选的方式来实现这一点而没有过度杀伤,那么这就是我正在寻找的答案.

我在某处读到了MVC过滤器与Global.ascx应用程序启动部分的结合使用,但这似乎不适合在控制器级别设置的变量和静态变量一样多.

有人可能会对这个主题提出许多不同的意见(可能是因为缺少一个更好的词)吗?也许可以为这个问题提供更明确的答案?我确信各种各样的意见都有它们的位置,我并不是在试图抹黑它们.但是,拥有明确且可能一致的答案会更好; 然后我可以对其他帖子进行排序,以确定最适合我的应用程序的内容.

当然,如果这个问题没有明确的答案; 告诉我,我会尝试从其他帖子中得出我自己的答案.

谢谢

================================================== =========

对提供的答案的更新回应

缓存和Cookie似乎是响应的一般偏好,但我也注意到缓存它不是在多个Web服务器上使用的理想候选者的声明,因为同步可能是一个潜在的问题.

值得称赞的是Tim,它表示数据库存储已经过优化,用户可以选择稍后返回并继续停止.

这是一个很好的观点,但对可能性保持远见; 一些用户可能无法返回,在数据库中留下不必要的数据,这可能是合理的.

因此,保持数据库优化和清洁("对我而言"具有相同的相关性)将需要实施维护任务,以根据设定的时间阈值自动使这些记录到期以考虑这些情况.虽然维护任务不是一个不容置疑的选择,但我仍然认为这仅仅为了作为临时存储的意图目的而增加了一些工作量.

尽管如此,我确实尊重蒂姆的建议,并认为在一定程度上反对我的初步意见是值得的.数据库似乎不是存储临时数据的可行选择; 所以我认为折衷方案是将数据存储在数据库中(考虑到购物车或类似的场景),可能是在结账后.正如您之前所述,这种方式可能会在后续访问时持续跟踪数据,因此您可以记录交易记录.但更重要的是,这些交易的数据与持久存在于数据库中具有真正相关性.

还有人说,尽管Session比数据库快; 但是,尽管有一些警告可以在某种程度上通过其他机制来缓解,例如利用SessionStateBehavior属性,仅作为一个例子.

但是......我认为Erik有点像Dunning-Kruger效应一样带回家.虽然,从这里给出的答案的内容和解释; 我严重怀疑任何回应的人的专业知识是否有问题.尽管如此,我倾向于同意这样一个事实:获得一致意见可能比我的合理期望高一些.

我更具体地寻找的是对一种技术的普遍共识,该技术可以舒适地适应不同的场景.换句话说,这些东西不仅可以适应我的特定场景,还可以为具有潜在更大流量的大型环境提供可扩展性元素.这样,编程的改变可以完全减轻或最小化.

==================================================

根据反馈摘要:

  1. 会话变量似乎适应较小的案例场景,并且在适用的情况下,但它们有一些潜在的持久性问题,以及其他值得注意的差异,正如Erik所说的非常彻底.所以这个选项显然不适合可扩展的模型.

  2. 缓存优于会话变量,但同样不是"最佳"可伸缩选项,这是由于Web服务器场环境中潜在的同步复杂性,如前所述.但仍然是一个选择.

  3. 数据库存储是可扩展的,但出于临时易失性存储的目的,从数据库的角度来看可能不是最优雅的选择,因为它需要定期清理.就个人而言,在我职业生涯早期拥有强大的数据库概念基础,这可能不会成为许多开发人员可能同意的事情.但是从程序员的角度来看,为此目的使用数据库可能足以满足Web开发的需要; 但是从DAL和DB开发的角度来看,这(对我而言)有可能强制执行额外的DB任务来强制执行有效的后端.

  4. Cookie似乎是一个很好的选择,具有Session变量和缓存的"理想"元素.

==================================================

结论

根据答案; 我认为COOKIES和CACHING似乎通常是全面的最佳实践建议,结合数据库存储,事后需要持续的持久性; 作为提供的可扩展性的潜在良好候选者.

2之间的最终选择似乎是基于需要存储的数据的数量和类型(例如敏感与非敏感以及是否存在客户可能改变其数据的担忧); 除了COOKIES的特殊考虑之外,它们可能会被客户禁用.

显然,从提供的答案中明确指出并得出结论,但在可扩展性方面,没有一个适合所有解决方案的解决方案; 我可能错了,但这些似乎是最好的选择.

因为所有的反应都很好; 我相当赞同所有帖子都有用,并接受Erik的答案作为一个全面的整体可扩展解决方案.我希望我可以选择多个已接受的答案,因为我相信蒂姆的回答也非常清晰和简洁.

古普塔的反应也不错,但我想更详细地提出建议的答案,而不是重复以前的帖子.

多谢你们!

asp.net-mvc session session-variables asp.net-mvc-3 asp.net-mvc-4

48
推荐指数
2
解决办法
3万
查看次数

JDBC驱动程序是否可以配置为使用共享内存协议

我在一个非常严格的环境中工作,我正在尝试配置Java应用程序以连接到我本地运行的SQL Server实例.

已启用共享内存,TCP/IP和命名管道客户端协议,但只有共享内存协议作为我的SQL Server实例的"网络配置"的一部分启用.所以每当我尝试建立连接时,我都会收到错误,

"连接被拒绝:连接.验证连接属性,检查主机上是否正在运行SQL Server实例并接受端口上的TCP/IP连接,并且没有防火墙阻止与端口的TCP连接."

我很确定这是因为实例上没有启用TCP/IP.那么有没有办法在JDBC URL中指定应该使用共享内存,或者这是不可能的?

java sql-server jdbc

7
推荐指数
1
解决办法
1972
查看次数

在SQL中审核DISABLE/ENABLE触发器

当有人试图在我们的数据库中启用或禁用触发器时,我需要一种方法来进行审核.DDL触发器替代方案很有效,但仅限于用户使用时的条件

ALTER TABLE <tableName> ENABLE TRIGGER <triggerName>
Run Code Online (Sandbox Code Playgroud)

要么

ALTER TABLE <tableName> DISABLE TRIGGER <triggerName>
Run Code Online (Sandbox Code Playgroud)

声明.根据我的确定,如果用户执行以下绕过ALTER命令的语句,则DDL方法呈现无效:

DISABLE TRIGGER <triggerName> ON <tableName>
ENABLE TRIGGER <triggerName> ON <tableName>
Run Code Online (Sandbox Code Playgroud)

我有几个关于捕获这些事件的想法,但没有一个能够奏效.其中一个是如果我可以访问sys.triggers视图下的表,我可以在该表上放置一个insert/update触发器并过滤触发器名称以获取审计; 但我怀疑它即使有可能也会导致无限递归.

这里有没有人对此问题的替代解决方案有任何可能的建议?我不明白为什么MS会允许增强版本的语句来逃避审计范围.也就是说,从最简单的方法审计; 使用SQL profiler似乎是不必要的开销.

sql t-sql sql-server sql-server-2008

6
推荐指数
1
解决办法
2337
查看次数

如何使用TSQL识别记录中的记录模式序列?

这对我来说是一个相当新的练习,但我需要找到一种方法来识别表格中的模式序列.例如,假设我有一个类似于以下内容的简单表:

在此输入图像描述

现在我想做的是识别和分组所有具有值为5,9和6的序列模式的记录,并在查询中显示它们.你会如何使用T-SQL完成这项任务?

结果应如下所示:

在此输入图像描述

我已经找到了一些可能实现这一目标的潜在例子,却找不到真正有用的东西.

t-sql sql-server common-table-expression sql-server-2008

5
推荐指数
1
解决办法
2144
查看次数

MMS 是否支持发送 HTML 内容?

我们使用 SMS 向我们的客户群发送文本消息,但最近也有人请求发送 HTML 内容。

我知道 SMS 仅支持文本消息,并且我知道通过 SMS 发送任何类型的 html 内容的唯一方法是在消息中提供返回 HTML 源的链接。

然而,这并不是他们想要做的理想情况,他们更喜欢发送实际的 HTML 内容而不是链接。

所以我认为彩信可能是类似的选择;但是我一直无法找到使用 Twilio API (MMS) 的 C# 风格的任何类型的教程。

补充一下,我只是“猜测”MMS 适合发送 HTML 内容;据我所知,MMS 通常用于支持发送照片和其他类型的二进制内容(不一定是 HTML 内容),特别是因为我还没有看到任何明确说明 HTML 支持的文档。

当然,我将不可避免地必须与该功能的请求者沟通,使用彩信可能无法到达他们的某些客户,因为彩信并不是在每个移动设备上默认启用的,而且事实上与 SMS 的使用相比,简单程度将被消除。

那么,MMS 将支持 HTML 内容并且它是 SMS 链接的类似替代方案,我是否正确?任何人都可以为我指明获取 Twilio C# 彩信教程的正确方向吗?

javascript c# node.js twilio twilio-api

5
推荐指数
1
解决办法
2632
查看次数

从一个或多个分片检索数据时,不同的架构会产生错误。收到的基本错误消息是:无效的对象名称

我在Azure中创建了一个外部数据源,作为无法在Azure平台上创建链接服务器的替代方法。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'secretpassword';
CREATE DATABASE SCOPED CREDENTIAL LinkedServerCredential  
WITH IDENTITY = 'login_name', SECRET = 'login_password-here';

CREATE EXTERNAL DATA SOURCE LinkedProductionDb
WITH
(
   TYPE=RDBMS,
   LOCATION='azure.database.windows.net',
   DATABASE_NAME='ProductionDb',
   CREDENTIAL= LinkedServerCredential
);
Run Code Online (Sandbox Code Playgroud)

一切顺利,没有错误,语句成功执行。因此,现在我创建一个EXTERNAL TABLE,该表具有与位于EXTERNAL DATASOURCE中定义的基础数据库中的表相同的表结构;但我希望将其分配给其他SCHEMA,以便能够将其区分为目标数据库中的链接表。所以我尝试这样做:

CREATE EXTERNAL TABLE [LNK].[Transactions](
    TransactionId BIGINT NOT NULL,
    CustomerId BIGINT NOT NULL,
    SubscriptionId BIGINT NOT NULL,
    ProductId BIGINT NOT NULL,
    TransType VARCHAR(100),
    TransKind VARCHAR(100),
    Success BIT,
    Amount MONEY,
    GatewayUsed VARCHAR(100),
    RecordImportDate DATETIMEOFFSET,
)
WITH
(
   DATA_SOURCE = LinkedProductionDb
)
GO
Run Code Online (Sandbox Code Playgroud)

现在令人惊讶的是,我能够毫无问题地创建此EXTERNAL TABLE;除了当我尝试通过简单查询访问数据时。我收到错误:“从一个或多个分片中检索数据时出错。收到的根本错误消息是:'无效的对象名'LNK.Transactions'。”。

我只花了几分钟的时间思考我做了什么以及为什么收到错误。显然,由于原始数据库中的表不是在LNK模式下创建的;它是无效的对象。 …

database sql-server azure

4
推荐指数
1
解决办法
932
查看次数

如何在Build(VS 2017)上运行TextTemplatingFileGenerator

我之前发现了这个问题,但我遇到的所有答案都是特定于早期版本的Visual Studio.似乎主要是VS2015及更早版本.

大多数答案的主要问题是它们依赖于Microsoft.TextTemplating.targets和/或TextTransform.exe的存在,以前安装的早期版本的Visual Studio和VS2017不再安装相应的目录或文件; 从我的理解来看,这是由于这方面的架构变化.

我试图使用Clarius.TransformOnBuild并且它工作正常(一次)但由于一些访问被拒绝的问题,我已经看到其他人已经开始抛出"TransformOnBuildTask"任务失败.

降级到该软件包的早期版本可以解决该错误,但之后它也不再在构建上运行TextTemplatingFileGenerator.这似乎不是一个非常可靠的方法.

没有像其他人建议的那样尝试使用AutoT4,因为该方法需要简单,并且不需要所有开发团队成员修改他们的环境.

其他解决方案建议将TextTransform.exe添加到%PATH%变量,这也需要团队对其环境执行mod.更不用说由于第一点我没有TextTransform.exe这一事实,并且无法保证团队中的其他开发人员也会如此.每个人都在运行VS2017

我只需要一个非常简单的方法就可以在任何构建过程中执行我的项目中的所有.tt文件,而无需整个开发团队为此工作制作单独的系统mod.

如果其他人都有类似的要求在VS2017下运行,我会对解决方案感兴趣.

c# msbuild c#-4.0 visual-studio-2017

4
推荐指数
1
解决办法
3343
查看次数

如何使用 .NET Core MVC 框架将 TwiML 实现为方法?

我正在执行基于 Twilio 示例的代码,用于接收和响应此处找到的 SMS 消息: https ://www.twilio.com/docs/sms/tutorials/how-to-receive-and-reply-csharp

唯一的区别是我使用的是.NET MVC Core,而不是示例中提供的.NET MVC Framework 。我遇到问题的代码是:

    [HttpPost]
    public TwiMLResult Index(SmsRequest incomingrequest)
    {
        var messagingResponse = new MessagingResponse();
        messagingResponse.Message("The Robots are coming! Head for the Hills!");
        return TwiML(messagingResponse);
    }
Run Code Online (Sandbox Code Playgroud)

如果我将该方法封装在默认情况下继承自 ControllerBase 类的控制器类中;TwiML 被标识为基类,而不是导致错误的方法。

public class SmsResponseController : ControllerBase
{
    [HttpPost]
    public TwiMLResult Index(SmsRequest incomingrequest)
    {
        var messagingResponse = new MessagingResponse();
        messagingResponse.Message("The Robots are coming! Head for the Hills!");
        return TwiML(messagingResponse); -- <-- Error: Non-invokable member TwiML cannot be used like …
Run Code Online (Sandbox Code Playgroud)

c# twilio asp.net-core-mvc twilio-twiml

3
推荐指数
1
解决办法
1323
查看次数

如何使用 TSQL 向现有的根 XML 节点添加属性?

我在 TSQL 中构建了一些 XML。

declare @requestXML xml

set @requestXML = (
select @dataXML
for xml raw ('rtEvent') 
Run Code Online (Sandbox Code Playgroud)

我现在拥有的一般输出遵循与此类似的模式:

<rtEvent>
  <ctx>
    .....
  </ctx>
</rtEvent>
Run Code Online (Sandbox Code Playgroud)

我现在想做的是向 rtEvent 根元素节点添加一些属性和值,但我不确定如何实现它。

我查看了 XML 对象的 Modify 方法并观察了插入、替换值和删除操作,但似乎无法弄清楚如何使用它们中的任何一个来实现我所追求的结果。

基本上,我希望能够修改根节点以反映以下内容:

<rtEvent type="customType" email="someaddress@domain.com"
  origin="eCommerce" wishedChannel="0" externalId="5515">
   <ctx>
     ...
   </ctx>
</rtEvent>
Run Code Online (Sandbox Code Playgroud)

我应该使用文档化的 XML.Modify 还是有更好的方法?应该怎么做?

xml t-sql sql-server

2
推荐指数
2
解决办法
4397
查看次数