1

私たちのアプリケーションでは、WCF レイヤーの PublicManagerService クラスが指数関数的に増加している兆候を示しています。その結果、パブリック API でメソッドが公開され、セキュリティのリスクが高まり、悪意のある攻撃の入り口となり、パフォーマンスが低下する可能性があります。 .

この例は、ユーザーが電子メールのハイパーリンクをクリックしたときに使用される Accept メソッドと Decline メソッドの AccountController クラスで見ることができます。パブリック API のメソッドに対して、次の呼び出しが行われます。

  • GetTransactionEmailLogByGUID
  • UpdateTransactionHitCount
  • 承認ログの保存
  • PDF を生成
  • UploadBlobByType
  • SetCurrentCulture (ただし、これは他のメソッドで使用されるため、残る場合があります)
  • メールを送る

Accept プロセスを実行するメソッドを 1 つだけ公開することを目指す必要があります。これは、まったく同じ呼び出しを利用する Decline メソッドについても同様です。

    /// <summary>
    ///  Response to Accept 
    /// </summary>
    /// <param name="guid"></param>
    /// <param name="comment"></param>
    /// <returns></returns>
    public ActionResult Accept(string guid,string comment)
    {
        Gateway.Instance.Logger.LogDebug("[Accept] method entered.");
        IEnumerable<TransactionEmailLog> transactionEmailLogs = _publicServiceManager.GetTransactionEmailLogByGUID(guid.Trim());
        ViewBag.GUID = guid.Trim();
        if (transactionEmailLogs != null && transactionEmailLogs.Count() > 0)
        {
            var transactionEmailLog = transactionEmailLogs.FirstOrDefault();
            if (transactionEmailLog.HitCount < 50)
            {
                _publicServiceManager.UpdateTransactonHitCount(transactionEmailLog.GUID);
                var transaction = transactionEmailLog.Transaction;

                if (transaction != null)
                {
                    ViewBag.InvoiceDate = transaction.InvoiceIssueDate != null ? Convert.ToDateTime(transaction.InvoiceIssueDate).ToShortDateString() : "";
                    ViewBag.InvoiceNumber = transaction.InvoiceNumber != null ? Convert.ToString(transaction.InvoiceNumber) : "";
                    ViewBag.DueDate = transaction.PaymentDueDate != null ? Convert.ToDateTime(transaction.PaymentDueDate).ToShortDateString() : "";
                    ViewBag.AmountDue = transaction.PaymentDueDate != null ? transaction.CurrencyCode + " " + Convert.ToDecimal(transaction.InvoiceTotalPayable, CultureInfo.CurrentCulture.NumberFormat).ToString("N") : "";
                }

                ViewBag.IsAcceptOrDecline = "True";
                TransactionApprovalLog approvalLog = new TransactionApprovalLog { IsAccepted = true, CreatedBy = transactionEmailLog.ReferredTo, CreatedDate = DateTime.UtcNow, Transaction = transaction };
                if (!string.IsNullOrWhiteSpace(comment))
                {
                    approvalLog.Comments = comment;
                }
                this._publicServiceManager.SaveApprovalLog(approvalLog);

                if (transaction != null)
                {
                    this.SendEmailNotficationOfInvoiceVerification(transaction, guid, comment, Language.Accepted, transactionEmailLog);
                }
            }
        }
        ViewBag.Message =Language.InvoiceVerificationAcceptMessage;

        Gateway.Instance.Logger.LogDebug("[Accept] method exited.");

        if (Request.IsAjaxRequest())
        {
            return Json(new { result = "success" }, JsonRequestBehavior.AllowGet);
        }
        return View("InvoiceVerification");
    }

ご覧のとおり、'_publicServiceManager' にはさまざまなメソッドが公開されています。私が行ったことは、必要になる GUID、CultureName などの情報を含む DataContract オブジェクトを作成し、これを PublicManagerService の新しいメソッドに渡すことです。

public void VerifyInvoice (InvoiceVerificationDataContract invoiceVerificationDetails){}

私の質問は、このコードのリファクタリングにどのようにアプローチするのが最善でしょうか? WCF レイヤーにロジックを配置する必要がありますか、それともすべてビジネス レイヤーに残す必要がありますか? 事前のあらゆる提案に感謝します。

4

1 に答える 1

1

このコードをリファクタリングする最初のステップは、何らかの統合テストで Accept 操作と Decline 操作の呼び出しをラップすることだと思います。

これにより、プロセス全体を後退させたり妥協したりしていないことを知って、サービスの構成をいじることができます。

このプロセスは、ある種のビジネス プロセスをモデル化しているかのように見えるため、これを一連の統合されたパブリック オペレーションに変換するには、次の作業を行う必要があると思います。

  • 操作全体を成功させるには、各ステップを正常に実行する必要がありますか?
  • 各ステップは特定の順序で実行する必要がありますか?
  • 1 つ以上のステップで失敗/回復をどのように処理しますか?
  • 別々の機能だったものを組み合わせることに意味があるのでしょうか?
  • ビジネス プロセス全体を同期的に呼び出す必要がありますか?

あなたはすでにこれらすべての点を考慮しているかもしれません. コマンド プロセッサ パターンは、プロセス内のさまざまなステップを分離する方法と見なすことができます。

これがあなたの質問に直接答えないことを理解してください。

于 2013-09-04T10:26:37.473 に答える