![](/img/trans.png)
[英]Why do validations not work correctly when testing my asp.net mvc 2 application via 3rd party tool(s)?
[英]Best Place to manage shared API calls to 3rd party application inside my asp.net mvc
我正在开发MVC 5 Web应用程序。 我有以下几层:
现在我有以下要求:
在某些操作方法中,我希望我的应用程序向第三方应用程序发送一些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(),并从相关的操作方法中引用它。
代码示例将有所帮助,但总的来说,我认为您在这里是正确的。
但据我所知,存储库类不应公开或引用WebClient()或类似的Web类,因为存储库应仅处理数据库和模型类
这不仅仅是关于数据库。 我的感觉是存储库处理“数据源”,而外部服务则属于此。 对此没有绝对的规则。 在您的情况下,什么有意义?
因此,我不确定管理共享的WebClient呼叫的最佳位置是什么?
我认为存储库很好。 根据您的体系结构,它还适合什么地方? 您始终可以添加一个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)
}
在您的BaseController中 :
public void SetAdditionalInfo(string description)
{
this.APICallDescription = description;
}
基本的ActionFilterAttribute
类具有以下可以覆盖的方法:
OnActionExecuting
–执行控制器操作之前,将调用此方法。
OnActionExecuted
–执行控制器动作后调用此方法。
OnResultExecuting
–在执行控制器动作结果之前调用此方法。
OnResultExecuted
–执行控制器动作结果后调用此方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.