我对 Umbraco 很陌生,正在使用 Umbraco 12。我有一个表面控制器,它有几个 Get 端点,当通过 Postman 发送请求时可以工作,还有一个 Post 端点,我不断地收到 400 错误请求。
下面的代码是控制器的精简版
[Controller]
public class EventsController : SurfaceController
{
private readonly IPublishedContentQuery _contentQuery;
public EventsController(
IUmbracoContextAccessor umbracoContextAccessor,
IUmbracoDatabaseFactory databaseFactory,
ServiceContext services, AppCaches appCaches,
IProfilingLogger profilingLogger,
IPublishedUrlProvider publishedUrlProvider,
IPublishedContentQuery contentQuery)
: base(umbracoContextAccessor,
databaseFactory,
services,
appCaches,
profilingLogger,
publishedUrlProvider)
{
_contentQuery = contentQuery;
}
[HttpGet]
public IActionResult GetPlacements(int year, string titleEvent)
{
// Redacted - Can hit when going to its url
https://localhost:44322/umbraco/surface/events/GetPlacements
}
[HttpPost]
public IActionResult PostPlacement(string teamName, string iso3, string finalPlacement, string titleEvent, string eventYear)
{
var rootContent = _contentQuery.ContentAtRoot().ToList();
var placementItems = rootContent.FirstOrDefault(x => x.Name == "Data")!.Children.FirstOrDefault(x => x.Name == "Event Placements");
// redacted - Cannot hit when going to its url
// https://localhost:44322/umbraco/surface/events/PostPlacement
return Ok();
}
}
我环顾四周,发现我需要将其作为表单数据或 x-www-form-urlencoded 发送
我所看到的问题
需要这个端点将从外部系统发送数据,然后我有一个正在被点击的视图,然后它将显示数据(该位确实有效)。
需要考虑的不同点
[Http, IgnoreAntiforgeryToken]
属性装饰你的操作方法,它应该可以工作(随时通知我)。为什么
SurfaceControllers
是非常特殊的控制器,与 Umbraco 的行为密切相关。所以,他们有特殊的行为。很多事情都是在幕后为你做的。在这种情况下,默认情况下,它们被设计为与包含防伪令牌的 HTML 表单一起使用。在 Umbraco 文档 (https://docs.umbraco.com/umbraco-cms/reference/routing/surface-controllers/) 中,当您阅读:
用于与 Umbraco 前端(不是后台)交互
您必须明白:“用于与 UMBRACO 生成的页面(内容)进行交互并使用 UMBRACO 的一些功能(不是后台)”
在这种情况下,您的控制器有一个
this.UmbracoContext.PublishedRequest
属性,其中包含调用页面的 IPublishedContent
。
这样做的需要是该端点将从以下位置发送数据 外部系统
该文档应包含
SurfaceControllers
并非旨在创建 API(应用程序 2 应用程序)。 它们是为页面(内容)2 SurfaceController
API 设计的。
当您使用 A2A API 的表面控制器时,
this.UmbracoContext.PublishedRequest
属性为 null
(许多其他功能不起作用)。
创建真正的 A2A API(REST 或非 REST):