HttpWebRequest可能会放慢网站速度

时间:2014-08-22 08:31:32

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

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

因此,您可以看到它在订单上处理的简单webrequest,并且所有产品变体都会发送到feefo。

现在:

  1. 从15日开始,整个星期都没有发生这种情况 实现)
  2. 该网站最近一直停滞不前。
  3. var内容中的流和阅读器可用于调试。

    我想知道代码是否会给网络带来任何与网站流程相关的信息? 另请注意,我已经运行了一些SQL语句来查看是否存在任何死锁或大型升级,到目前为止看起来很好,Logs也可以通常记录Bots。

    任何帮助将不胜感激!

    编辑:还要注意,此代码位于一个被调用并包装在一个try catch

    中的方法中

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

2 个答案:

答案 0 :(得分:3)

在处理订单时调用其他网站会降低性能,因为您正在呼叫您无法控制的网站。你不知道要花多少时间。此外,GetResponse方法可以抛出异常,如果您不在外部try / catch块中记录任何内容,那么您将无法知道发生了什么。

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

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

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

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

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

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

答案 1 :(得分:0)

据我所知,您正在对其他网站进行阻止同步调用,这肯定会在请求 - 响应过程之间减慢您的网站速度。 Marco 建议的内容是有效的,请尝试在ITask中执行此操作。或者,如果您需要立即执行而不是计划安排,则可以使用异步Web请求来删除块。 :)