为什么服务操作返回的时间比执行操作中的实际代码要长?

时间:2017-04-18 09:13:42

标签: c# wcf ienumerable

[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。

2 个答案:

答案 0 :(得分:1)

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

return result;方法中的MapLeads更改为

return result.ToList();

并且秒表处理时间应该更接近实际响应时间。

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

答案 1 :(得分:1)

来自我的同事的某些意见。希望这可以帮助任何未来的读者

原因为什么有时会更快?

根据数据的数量,您可以与之抗衡。不确定Postman如何存储收到的数据,但是如果有任何相关的内部对象/ dom会花费一些时间。 对于可能是查询/参数缓存的4/3秒响应。

更多解释为何延迟

  1. 网络延迟(这完全取决于到达服务器请求的路由。延迟时间因地区而异)
  2. 请求管道处理。
  3. 方法处理。 (如果方法使用任何数据库查询,则在应用程序和数据库服务器之间建立连接需要时间)
  4. 序列化数据以构建响应。
  5. 渲染/显示来自服务器的响应。
  6. 最重要的是,互联网速度将起到至关重要的作用。

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

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