这看起来非常简单.我需要从一些ASP.NET应用程序发送电子邮件.我需要始终如一地做到这一点,没有奇怪的错误,并且没有CPU利用率.我不是在谈论大量的电子邮件,只是偶尔的电子邮件.
System.Net.Mail 似乎被严重破坏.SmtpClient不会发出Quit命令(可能是因为Microsoft(R)对以下规范不感兴趣),因此连接保持打开状态.因此,如果有人在该连接最终关闭之前尝试通过电子邮件发送,则可能会从SMTP服务器收到有关打开过多连接的错误.这是Microsoft(R)完全不感兴趣修复的错误.看这里:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711
此外,如果你环顾一些建议使用此代码来解决此问题:
smtpClient.ServicePoint.MaxIdleTime = 1;
smtpClient.ServicePoint.ConnectionLimit = 1;
Run Code Online (Sandbox Code Playgroud)
好的,是的,这确实"解决"了连接被打开的问题.但是,如果您愿意,可以在服务器上进行尝试,这会使运行进程(在本例中为w3wp.exe)的CPU跳转并保持100%,直到您的应用程序池被回收.无论出于何种原因,运行mscorwks.dll!CreateApplicationContext的线程都是罪魁祸首.
这具有非常好的副作用,如果您在持续100%CPU使用率的Web主机上运行,您将禁用应用程序池.所以这并不像有些人所说的那样微不足道.
所以我的问题是该怎么办?我需要做的就是这么简单; 但是,那些"太多连接打开"错误是不可接受的,也不是100%的CPU使用率.我不想购买第三方组件,不是因为我便宜,而是因为我购买了足够的组件和MSDN订阅,因为简单的SMTP功能需要花费100到300美元.
我读到将MaxIdleTime设置得更高可能会有所帮助,但我对此持怀疑态度.我不想仅仅因为Microsoft不想遵循SMTP规范而冒着我的应用程序池被禁用的风险.
编辑: 我查看了quiksoft.com组件,但它不支持SMTP身份验证,它的成本为500美元.必须有一个解决这个问题的方法.
我正在构建一个Web应用程序,我想扩展到许多用户.此外,我需要通过Web服务向受信任的第三方公开功能.
我正在使用LLBLGen生成数据访问层(使用SQL Server 2008).目标是构建一个业务逻辑层,使Web应用程序不受DAL细节的影响,当然,还要提供超出DAL的额外级别的验证.此外,就我现在所知,Web服务基本上是BLL的薄包装.
当然,DAL有自己的一组实体对象,例如CustomerEntity,ProductEntity等.但是,我不希望表示层直接访问这些对象,因为它们包含DAL特定方法,并且程序集特定于DAL,依此类推.因此,我们的想法是创建数据传输对象(DTO).我们的想法是,这些本质上是普通的旧C#/ .NET对象,它们拥有CustomerEntity的所有字段,实际上是数据库表Customer,但没有其他东西,除了一些IsChanged/IsDirty属性.所以,会有CustomerDTO,ProductDTO等.我认为这些将继承自基础DTO类.我相信我可以使用LLBLGen的一些模板生成这些,但我还不确定.
因此,想法是BLL将通过接受和返回这些DTO对象来公开其功能.我认为Web服务将处理将这些对象转换为使用它的第三方的XML,许多可能不使用.NET(也有些东西可以通过Web应用程序使用JSON从AJAX调用调用脚本).
我不确定设计这个以及如何前进的最佳方式.以下是一些问题:
1)如何向客户端公开(表示层和Web服务代码)
我在想有一个公共类有这些方法,每次调用都是一个原子操作:
InsertDTO,UpdateDTO,DeleteDTO,GetProducts,GetProductByCustomer等等......
然后客户端将调用这些方法并传入适当的参数,通常是DTO.
这是一个好的,可行的方法吗?
2)从这些方法返回什么?显然,Get/Fetch类方法将返回DTO.但是Inserts呢?签名的一部分可能是:
InsertDTO(DTO dto)
Run Code Online (Sandbox Code Playgroud)
但是,插入什么时应该返回?我希望收到错误通知.但是,我对某些表使用自动增量主键(但是,有些表具有自然键,特别是多对多表).
我想到的一个选项是Result类:
class Result
{
public Exception Error {get; set;}
public DTO AffectedObject {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
因此,在插入上,DTO将获取其get ID(如CustomerDTO.CustomerID)属性集,然后放入此结果对象.如果Result.Error!= null,客户端将知道是否存在错误,然后它将知道Result.AffectedObject属性中的ID.
这是一个好方法吗?一个问题是它似乎传递了大量来回的冗余数据(当它只是ID时).我不认为添加"int NewID"属性是干净的,因为一些插入不会有这样的自动增量键.另一个问题是我认为Web Services不会很好地处理这个问题吗?我相信他们只会在Result类中返回AffectedObject的基础DTO,而不是派生的DTO.我想我可以通过拥有大量不同类型的Result对象(可能从基础Result派生并继承Error属性)来解决这个问题,但这似乎不是很干净.
好吧,我希望这不是太冗长,但我想说清楚.
如何在LINQ中的Where谓词中指定条件而不获取空引用异常.例如,如果q是IQueryable,我该怎么做:
Expression<Func<ProductEntity,bool>> predicate = p => !search.CategoryId.HasValue || (search.CategoryId.HasValue && search.CategoryId == p.CategoryId);
var q2 = q.Where(predicate);
Run Code Online (Sandbox Code Playgroud)
这search是一个对象,其中包含可能或不可能设置的搜索条件,如search.CategoryId可能未设置但如果是,我想获取由该条件设置的产品.
当我这样做时,我得到空引用异常.
我可以使用哪些好的工具来监控IIS.包含的内容似乎没有我想要的那么有用.我意识到我可以添加性能计数器; 那些人不会告诉我很多; 它只是插入通用图形工具的一组属性.
我有旧的遗留应用程序悬挂和各种各样的其他东西的问题.此外,当我需要获取基本信息,例如我在IIS中有多少连接及其详细信息时,我不知道该怎么做.我已经广泛搜索了,我找不到多少.我找到了一些日志解析器,但我想要实时.我发现一些商业工具似乎并不是我想要的,除了我想找到一些免费的东西.这是非常基本的东西,很容易在Apache中获得.我找到了IISTracer,但我有点怀疑它; 我确实安装并试用了.还有别的事吗?其中一些遗留应用程序是经典的ASP,所以只是CLR Profiler并不是我想要的,尽管它们很方便.
编辑:IISTracer真的是IIS中唯一这样的工具吗?
我有一个查询,在生产中运行大约2-4分钟,但在开发时运行几秒钟.这两个数据库都在同一个服务器上.(没有关于开发和生产的讲座,生产仍然在开发中).
我的意思是,我可以打开两个查询窗口,并始终获得两个不同的结果.我运行了RedGate SQLCompare并且没有架构差异(索引等)的区别.我已禁用连接到数据库的站点,因此除了我的Management Studio会话之外不应该有任何连接.
可能是什么导致了这个?我通过复制生产数据库来创建开发数据库(在Management Studio中,右键单击数据库并单击"复制数据库")
这真的很奇怪.我不想进行任何索引更改,因为奇怪的是副本速度非常快,但生产非常非常慢但应该是基本上完全复制的.
假设我有一个可以通过在下拉列表中指定一些值来限制的报告.此下拉列表引用具有> 30,000条记录的表.我不认为填充下拉列表是可行的!那么,在这种情况下,为用户提供选择值的最佳方法是什么?这些值实际上没有类别,即使我通过值的第一个字母细分(通过具有一些嵌套下拉情况),仍可能留下几千个条目.
处理这个问题的最佳方法是什么?
c# ×2
.net ×1
asp.net ×1
dto ×1
iis ×1
iis-6 ×1
linq ×1
llblgenpro ×1
monitoring ×1
performance ×1
smtp ×1
smtpclient ×1
sql-server ×1