在我的 asp.net MVC 中管理对第三方应用程序的共享 API 调用的最佳位置

本文关键字:应用程序 共享 API 最佳位置 调用 第三方 asp 我的 net MVC 管理 | 更新日期: 2023-09-27 18:36:46

我正在开发MVC 5 Web应用程序。我有以下几层:-

  1. 视图
  2. 控制器类。
  3. 存储库类,在控制器类中引用。
  4. 模型分类
  5. 实体框架数据库上下文。

现在我有以下要求:-

在某些操作方法中,我希望我的应用程序向第三方应用程序发送一些API调用(使用WebClient())。

其中,除 Description 参数外,所有操作方法的 API 调用几乎相同。现在,我可以在我的存储库类中拥有这个共享逻辑,并从我的操作方法中引用它。但据我所知,存储库类不应公开或引用WebClient()或类似的 Web 类,因为存储库应仅处理数据库和模型类。所以我不确定管理共享WebClient呼叫的最佳位置是什么?所以从操作方法我只调用共享类并传递描述字段?

例如,这里是直接包含 Web 客户端的操作方法的示例:-

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Server s)
{
    if (ModelState.IsValid)
    {
        try
        {
            //code goes here....
            XmlDocument doc = new XmlDocument();
            using (var client = new WebClient())
            {
                var query = HttpUtility.ParseQueryString(string.Empty);
                query["username"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiUserName"];
                query["password"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiPassword"];
                query["assetType"] = controllername;
                query["operation"] = "UpdateAsset";
                query["assetName"] = s.RESOURCENAME;
                query["description"] = s.DESCRIPTION;
                //code goes here
                var url = new UriBuilder(apiurl);
                url.Query = query.ToString();
                try
                {
                    string xml = client.DownloadString(url.ToString());
                    doc.LoadXml(xml);
                    updatestatus = doc.SelectSingleNode("/operation/operationstatus").InnerText;
                }
                catch (WebException ex)
                {
                    ModelState.AddModelError(string.Empty, "Error occurred:" + ex.InnerException.Message);
                }
            }
        }
    }
}

现在我不想在多个操作方法上添加相同的WebClient方法,而是将WebClient()放在共享类上,并从相关的操作方法中引用它。

在我的 asp.net MVC 中管理对第三方应用程序的共享 API 调用的最佳位置

代码示例会有所帮助,但总的来说,我认为您在这里走在正确的轨道上。

但据我所知,存储库类不应该公开或引用 WebClient() 或类似的 Web 类,作为存储库应该处理的 仅限数据库和模型类

这不仅仅是关于数据库。 我的感觉是存储库处理"数据源",外部服务属于这种情况。 对此没有绝对的规则。 在你的情况下,什么有意义?

所以我不确定管理共享Web客户端的最佳位置是什么 调用?

我认为存储库很好。 根据您的架构,它还适合在哪里? 您始终可以添加 WebApi 部分,但它可能不会增加任何价值,只会使事情复杂化。

所以从操作方法中,我只调用共享类并传递 描述字段 ?

对我来说看起来像一个计划。 您还可以跳过控制器/操作方法调用,并通过 ajax 调用直接从视图中转到服务

您可以创建操作筛选器来管理此 API 调用...因此,您无需使用此代码或调用其他类来填充您的操作。

如果描述在每个操作中都是静态的,您甚至可以将描述放在装饰器本身中。

[Httppost]
[ValidateAntiForgeryToken]
[MyApiFilter(Description="theDescription")]
public ActionResult Create(Server s)
{
    //Your action code
}

如果无法将描述放在装饰器中,并且需要更动态的内容,则可以在操作代码中设置一些参数,由筛选器在运行时获取。

[Httppost]
[ValidateAntiForgeryToken]
[MyApiFilter]
public ActionResult Create(Server s)
{
    //Your action code
    this.SetAdditionalInfo(myDescription)
}

基本控制器中:

public void SetAdditionalInfo(string description)
{
    this.APICallDescription = description;
}

ActionFilterAttribute类具有以下可以重写的方法:

OnActionExecuting – 在控制器操作之前调用此方法 被执行。

OnActionExecuted – 在控制器操作后调用此方法 被执行。

OnResultExecuting – 在控制器操作之前调用此方法 结果被执行。

OnResultExecuted – 在控制器操作后调用此方法 结果被执行。