私たちのアプリケーションでは、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 レイヤーにロジックを配置する必要がありますか、それともすべてビジネス レイヤーに残す必要がありますか? 事前のあらゆる提案に感謝します。