2017-04-18 9 views
2
[DataContract] 
public class SalesRepReturn : BaseReturn 
{ 
    [DataMember] 
    public IEnumerable<LeadInfo> TodayAppointments { get; set; } 
    [DataMember] 
    public IEnumerable<LeadInfo> TodayKnock { get; set; } 
    [DataMember] 
    public IEnumerable<LeadInfo> OutstandingLeads { get; set; } 
    [DataMember] 
    public IEnumerable<LeadInfo> HotLeads { get; set; } 
    [DataMember] 
    public IEnumerable<LeadInfo> AssociatedLeads { get; set; } 
} 

[OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "/SalesRepData", 
     RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Wrapped)] 
    SalesRepReturn SalesRepData(int salesRepId, float lat, float lon, int distance); 

public SalesRepReturn SalesRepData(int salesRepId,float lat,float lon,int distance) 
    { 
     Stopwatch stopwatch = Stopwatch.StartNew(); 
     Stopwatch stopwatch1 = Stopwatch.StartNew(); 
     var salesRepReturn = new SalesRepReturn { ReturnMsg = "Enter valid representative Id", ReturnCode = 401 }; 
     if (salesRepId == 0) return salesRepReturn; 
      salesRepReturn.AssociatedLeads = MapLeads(salesRepId,lat,lon,distance); 
      stopwatch.Stop(); 
      LogTimeTaken(DateTime.Now.ToString() + " Time Taken for Map Leads SRD " + stopwatch.ElapsedMilliseconds.ToString()); 
     salesRepReturn.ReturnCode = 200; 
     salesRepReturn.ReturnMsg = Messages.Success; 
     stopwatch1.Stop(); 
     LogTimeTaken(DateTime.Now.ToString() + " Entire Method SRD " + stopwatch1.ElapsedMilliseconds.ToString());    
     return salesRepReturn; 
    } 

private IEnumerable<LeadInfo> MapLeads(int salesRepId,float lat,float lon,int distance) 
    { 
     var result=_context.Database.SqlQuery<LeadInfo>("GetMappedLeadsByLatLong @salesRepId,@latitude,@longitude,@distance", new SqlParameter("salesRepId", salesRepId), new SqlParameter("latitude", lat), new SqlParameter("longitude", lon), new SqlParameter("distance", distance)); 
     return result; 
    } 

以上是我的WCF服务代码。你可以看到我已经添加了时间戳来获得处理时间。处理时间甚至不需要一秒钟,但邮递员的响应时间在2秒到15秒之间变化。我不知道可能是什么原因。我预计该方法需要1或2秒。响应的大小平均为40KB。为什么服务操作需要更长的时间才能返回,而不是操作中的实际代码需要执行?

+0

这是在单个呼叫或多个并发呼叫,你得到延迟? –

+0

@tomredfern它是一个单一的电话。 –

+0

而且为了澄清一下,你对于为什么实际的服务操作在调用它时比实际的代码执行需要执行时花费更长时间而感到困惑? –

回答

1

某些输入从我的同事this.Hope这将有助于未来的读者

原因有时候会更快?

取决于数据的数量,你将会得到相应的结果。不确定Postman如何存储接收到的数据,但是如果有任何关联的内部对象/ dom需要一些时间。 至于可能是查询/参数缓存的4/3秒响应。

更多的解释了为什么推迟

  1. 网络延迟(这将取决于纯粹的路线,以达到您的要求的服务器。延迟时间可根据地区)
  2. 请求流水线处理。
  3. 方法处理。 (如果方法使用任何数据库查询,建立应用程序和数据库服务器之间的连接将需要时间)
  4. 序列化数据以构建响应。
  5. 渲染/显示来自服务器的响应。

最重要的是,互联网速度将起到至关重要的作用。

解决方案: 最后,它是后端数据库服务器的带宽。带宽速度的增加将响应时间减少到大部分响应的5秒以下,对于1.25MB大小的响应的响应时间减少到10秒。

但这不是解决方案,我的前端(IIS)端和后端(DB服务器)使用公共IP进行通信。我们与我们的服务器提供商进行了交谈,以便使用私有IP进行发布,并为我们解决了问题。

1

这是因为当你停止时间的时候你的SqlQuery还没有被执行。它在DataContract的序列化过程中执行。

变化return result;MapLeads方法

return result.ToList(); 

和秒表处理时间应该更接近于实际响应时间。

您可以找到有关Enitity框架SQL的延迟执行的详细信息查询MSDN上: https://msdn.microsoft.com/en-us/library/jj592907(v=vs.113).aspx

+0

感谢您的快速响应。我曾尝试过,如你所说,它接近我的回应时间。但考虑到SQL中的直接存储过程执行,它具有巨大的时间差异。我的意思是当我执行SP时,它需要不到一秒的时间,但代码需要大约20秒。 –

+0

我已经按照建议进行了改变并尝试了如下的响应时间25,处理时间19,响应时间4,处理时间3,响应时间24,处理时间23的方法和响应以及处理时间。但为什么这种不一致呢? –

相关问题