【问题标题】:Orchard cms apicontroller that returns xml返回 xml 的 Orchard cms apicontroller
【发布时间】:2026-01-08 15:05:01
【问题描述】:

我一直在尝试实现 David Hayden 的 Orchard CMS 和 ASP .NET Web API http://www.davidhayden.me/blog/orchard-cms-and-asp.net-web-api,但我遇到了问题,基本上是找不到页面。

这就是我所拥有的:

在我的控制之下

ContactViewModel.cs

namespace Sunkist.ContactManager.Controllers
{
 public class ContactsController : ApiController
 {
    private readonly IContentManager _contentManager;

    public ContactsController(IContentManager contentManager)
    {
        _contentManager = contentManager;
    }

    public IEnumerable<ContactViewModel> Get()
    {
        return _contentManager
            .Query(VersionOptions.Published, "Contact")
            .List()
            .Select(c => new ContactViewModel(c));
    }

    public ContactViewModel Get(int id)
    {
        var contact = _contentManager.Get(id);

        if (contact == null)
            throw new HttpResponseException
              (new HttpResponseMessage(HttpStatusCode.NotFound));

        return new ContactViewModel(contact);
    }
 }
}

ViewModel 文件夹 ViewModel.cs

namespace Sunkist.ContactManager.ViewModel
{
  public class ContactViewModel
  {
    private Orchard.ContentManagement.ContentItem c;

    public ContactViewModel(Orchard.ContentManagement.ContentItem c)
    {
        // TODO: Complete member initialization
        this.c = c;
    }
    public string Name { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
  }
}

和迁移

namespace Sunkist.ContactManager {
  public class Migrations : DataMigrationImpl {

    public int Create() {
        // Creating table ContactRecord
        SchemaBuilder.CreateTable("ContactRecord", table => table
            .ContentPartRecord()
            .Column("Name", DbType.String)
            .Column("Address", DbType.String)
            .Column("City", DbType.String)
        );

        return 1;
    }
  }
}

我是 Orchard 和 .Net MVC 的新手,所以我不确定自己做错了什么?

【问题讨论】:

  • 你去哪里得到404?
  • 您确定这是您操作的正确网址吗?您是否创建了自定义路线? “api”部分来自哪里?根据您链接的文章,如果您创建了该路线,它应该是 /api/contacts。
  • 我也在尝试实现 ApiController。我得到一个 404 只是试图点击我的 Orchard 根页面。当我排除我的 ContactsController.cs 等效项并重新编译模块时,Orchard 根页面加载得很好。 Orchard 对你的行为方式是否相同?或者就在您尝试访问您的 /api/sunkist... 页面时?

标签: asp.net-mvc asp.net-web-api orchardcms


【解决方案1】:

仔细检查包含 Web API 控制器的模块的名称。

通过 VS GUI,我创建了一个新的 Web api 控制器类“TestController.cs”,但找不到正确的端点 url。

也就是说,直到我查看了我添加控制器的项目中的 Module.txt。项目是“Orchard.Users”,但是Module.txt文件中的名字只是“Users”。

我能够到达“http://example.com/api/users/test”的端点。

值得注意的是:我在“.../UsersApi”为此设置了一个路由,但“自动魔术”URL 模式仍然有效。代码如下。另外,我后来添加了一个新模块来包含我的 api 控制器,直到我在仪表板中启用该模块后它才能工作。

TestController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace Orchard.Users.Controllers
{
    public class TestController : ApiController
    {
        // GET api/<controller>
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/<controller>/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/<controller>
        public void Post([FromBody]string value)
        {
        }

        // PUT api/<controller>/5
        public void Put(int id, [FromBody]string value)
        {
        }

        // DELETE api/<controller>/5
        public void Delete(int id)
        {
        }
    }
}

HttpRoutes.cs

using System.Collections.Generic;
using Orchard.Mvc.Routes;
using Orchard.WebApi.Routes;

public class HttpRoutes : IHttpRouteProvider
{

    public void GetRoutes(ICollection<RouteDescriptor> routes)
    {
        foreach (RouteDescriptor routeDescriptor in GetRoutes())
        {
            routes.Add(routeDescriptor);
        }
    }

    public IEnumerable<RouteDescriptor> GetRoutes()
    {
        return new[] {
                new HttpRouteDescriptor {
                    Name = "UsersApi",
                    Priority = -10,
                    RouteTemplate = "usersapi/{id}",
                    Defaults = new { 
                        area = "Orchard.Users", 
                        controller = "Test",
                        id = RouteParameter.Optional
                    },
                }
            };
        }
    }

【讨论】: