使用 Visual Studio 2012、C#.net 4.5、SQL Server 2008、Feefo、Nopcommerce
大家好,我最近在我们现有的网站中实现了一项新的评论服务。
当更改上线第一天时,一切正常。
从那时起,尽管向 Feefo 发送销售数据一直无法正常工作,但没有任何日志表明出现任何问题。
在 Nop Commerce 服务的 OrderProcessingService.cs 中,当订单已确认完成时,我调用 HttpWebrequest。这是代码。
var email = HttpUtility.UrlEncode(order.Customer.Email.ToString());
var name = HttpUtility.UrlEncode(order.Customer.GetFullName().ToString());
var description = HttpUtility.UrlEncode(productVariant.ProductVariant.Product.MetaDescription != null ? productVariant.ProductVariant.Product.MetaDescription.ToString() : "product");
var orderRef = HttpUtility.UrlEncode(order.Id.ToString());
var productLink = HttpUtility.UrlEncode(string.Format("myurl/p/{0}/{1}", productVariant.ProductVariant.ProductId, productVariant.ProductVariant.Name.Replace(" ", "-")));
string itemRef = "";
try
{
itemRef = HttpUtility.UrlEncode(productVariant.ProductVariant.ProductId.ToString());
}
catch
{
itemRef = "0";
}
var url = string.Format("feefo Url",
login, password,email,name,description,orderRef,productLink,itemRef);
var request = (HttpWebRequest)WebRequest.Create(url);
request.KeepAlive = false;
request.Timeout = 5000;
request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusDescription == "OK")
{
var stream = response.GetResponseStream();
if(stream != null)
{
using (var reader = new StreamReader(stream))
{
var content = reader.ReadToEnd();
}
}
}
}
正如您所看到的,这是一个根据订单进行处理的简单网络请求,所有产品变体都发送到 Feefo。
现在:
- 自 15 日(2015 年 12 月 15 日)以来,这一整周都没有发生过这种情况 实现)
- 该网站最近陷入瘫痪。
var 内容中的流和读取器用于调试。
我想知道代码是否会向您标记任何可能与网站进程相关的内容? 另请注意,我已经运行了一些 SQL 语句来查看是否存在任何死锁或大幅升级,到目前为止似乎还不错,日志也很好,只是常规的机器人日志记录。
任何帮助将不胜感激!
编辑:另请注意,此代码位于调用并包装在 try catch 中的方法中
更新:忘记“不发送”,那是因为我刚刚被告知我的代码上周已回滚
最佳答案
在处理订单时调用另一个网站可能会降低性能,因为您正在调用一个不受您控制的网站。你不知道要花多少时间。此外,GetResponse 方法可能会引发异常,如果您不在外部 try/catch block 中记录任何内容,那么您将无法知道发生了什么。
执行此类任务的最佳方法是实现类似“发送电子邮件”计划任务的功能,并在您有能力等待远程服务时发送数据。如果你尝试的话,这很容易。如果升级 nopCommerce 代码库,它会更具弹性且更易于维护。
这就是我做类似事情的方式:
避免修改 OrderProcessingService:创建使用
OrderPlacedEvent
的自定义服务或插件或OrderPaidEvent
(只需实现IConsumer<OrderPaidEvent>
或IConsumer<OrderPlacedEvent>
接口(interface))。如果您当时不需要响应,请不要在处理请求时直接调用第三方服务。它只会延迟你的进程。在步骤 1 中创建的服务中,存储数据并稍后将其发送到 Feefo。如果您不介意在重新启动站点时丢失待处理的数据(例如,对于统计数据来说这可能没问题),您可以将数据存储到数据库或使用静态集合。
实现第 2 点的最佳方法是添加一个新的计划任务来实现
ITask
(记得在ScheduleTask表中添加一条记录)。只需恢复存储的数据即可进行处理。添加一些日志记录。很简单,只需获取
ILogger
实例并调用Insert
.
关于c# - HttpWebRequest 可能会减慢网站速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25442756/