【问题标题】:HttpWebRequest possibly slowing websiteHttpWebRequest 可能会减慢网站速度
【发布时间】:2014-08-22 08:31:31
【问题描述】:

使用 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();
            }
        }
    }
}

如您所见,它是一个在订单上处理的简单 Web 请求,所有产品变体都发送到 Feefo。

现在:

  1. 自 15 日(即 实施)
  2. 该网站最近一直处于停顿状态。

var 内容中的流和阅读器可用于调试。

我想知道代码是否会向您提示与网站流程相关的任何内容? 另请注意,我已经运行了一些 SQL 语句来查看是否存在任何死锁或大规模升级,到目前为止似乎还不错,日志也很好,只是通常的 Bot 日志记录。

任何帮助将不胜感激!

编辑:还请注意,此代码位于一个被调用并包装在 A try catch 中的方法中

更新:忘记“不发送”,那是因为我刚刚被告知我的代码上周回滚了

【问题讨论】:

  • 为了给您一个更好的答案,您能指出您添加该代码的确切位置吗?
  • 它在 orderprocessing 方法中的 Nop.Services.Orders 中找到的“OrderProcessingService.cs”的一部分,有一个“if”语句检查订单是否“已确认”,如果是则尝试调用该方法,这是我的代码所在的位置。

标签: c# sql-server-2008 asp.net-mvc-4 nopcommerce


【解决方案1】:

在处理订单时调用另一个网站会降低性能,因为您调用的是一个不受您控制的网站。你不知道要花多少时间。此外,GetResponse 方法可能会引发异常,如果您没有在外部 try/catch 块中记录任何内容,那么您将无法知道发生了什么。

执行此类任务的最佳方式是实施类似“发送电子邮件”计划任务,并在您有能力等待远程服务时发送数据。如果您尝试,这很容易。如果您升级 nopCommerce 代码库,它将更具弹性且更易于维护。

这就是我做类似事情的方式:

  1. 避免修改 OrderProcessingService:创建使用 OrderPlacedEventOrderPaidEvent 的自定义服务或插件(只需实现 IConsumer<OrderPaidEvent>IConsumer<OrderPlacedEvent> 接口)。

  2. 如果您此时不需要响应,请不要在处理请求时直接调用第三方服务。它只会延迟你的过程。在步骤 1 中创建的服务中,存储数据并稍后将其发送给 Feefo。如果您不介意在重新启动站点时丢失待处理的数据(例如统计数据可能没问题),您可以将数据存储到数据库或使用静态集合。

  3. 实现第 2 点的最佳方法是添加一个实现 ITask 的新计划任务(记得在 ScheduleTask 表中添加一条记录)。只需恢复存储的数据即可进行处理。

  4. 添加一些日志记录。很简单,只需获取一个ILogger 实例并调用Insert

【讨论】:

  • 很好的建议,那里。是的,我调用该方法的 try catch 正在捕获任何错误并记录它们,尽管到目前为止还没有抛出一个错误。我会看看与订单处理服务的进一步分离,因为我必须同意这听起来可能是罪魁祸首。
【解决方案2】:

据我所知,您正在对其他网站进行阻塞同步调用,这肯定会在请求-响应过程之间减慢您的网站速度。 Marco 的建议是有效的,请尝试在 ITask 中执行。或者,如果您需要立即完成而不是预定的事情,您可以使用异步 Web 请求来潜在地删除块。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多