2017-04-18 20 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サービスコードです。処理時間を得るためにタイムスタンプを追加したことがわかります。処理時間は1秒もかかりませんが、応答時間は郵便配達員で2秒から15秒の間で変わります。私は何が原因か分かりません。私はこの方法が1秒か2秒かかっていると思っています。平均での応答のサイズは40KBです。サービス操作の実行に必要な実際のコードよりも、サービス操作の戻り時間が長くなるのはなぜですか?

+0

これは、1回のコールでか複数の同時コールで遅延が発生しますか? –

+0

@tomredfernこれは1回の呼び出しです。 –

+0

明確にするために、実際のサービス操作が呼び出されたときの戻り値が、操作内の実際のコードが実行されるよりも時間がかかる理由について混乱していますか? –

答えて

1

this.Hopeに私の同僚から特定の入力これは、将来の読者になぜ

理由を助けますそれは時々速いですか?

データの量によっては、あなたはそれと争う必要があります。 Postmanが受信したデータをどのように格納するかは不明ですが、内部オブジェクト/ DOMが関連付けられていれば時間がかかります。 4/3秒の応答はおそらくクエリ/パラメータキャッシングです。

  1. ネットワーク遅延(これは純粋にサーバーへのリクエストに到達する経路に依存する。待ち時間領域に基づいて異なります)
  2. 要求パイプライン処理を遅らせる理由について

    詳しい説明。

  3. メソッド処理。 (メソッドがDBクエリを使用する場合、アプリケーションとDBサーバーの間の接続を確立するには時間がかかる)
  4. 応答を構成するためにデータをシリアライズする。
  5. サーバーからの応答をレンダリング/表示します。

とりわけ、インターネット速度は非常に重要な役割を果たします。

解決策: 最後に、それはバックエンドDBサーバーの帯域幅でした。帯域幅の速度の増加は、応答時間を5秒未満に、応答のほとんどを1.25MBのサイズで10秒に短縮しました。

しかし、これは解決策ではありません。私のフロント(IIS)エンドとバックエンド(DBサーバー)はパブリックIPを使用して通信しました。プライベートIPを使用してサーバー・プロバイダーと話をして、問題を解決しました。

1

これは、時間を停止してもSqlQueryがまだ実行されていないためです。これは、DataContractのシリアル化中に実行されます。

return result.ToList(); 

にごMapLeads方法の変更return result;とストップウォッチの処理時間は、実際の応答時間に近づくべきです。

あなたはEnitityフレームワークSQLの遅延実行の詳細については、MSDNに問い合わせを見つけることができます: https://msdn.microsoft.com/en-us/library/jj592907(v=vs.113).aspx

+0

ありがとうございました。私はそれが私の応答時間に近いと言ったので、はい前にそれを試しました。しかし、SQLでの直接ストアドプロシージャの実行を考えると、大きな時間差があります。つまり、SPを実行するには1秒未満かかりますが、コードには20秒かかります。 –

+0

私は、以下のように提案され、試行された方法と応答と処理時間(応答時間25、処理時間19)、(応答時間4、処理時間3)、(応答時間24、処理時間23)しかし、なぜこの不一致? –

関連する問題