POST /api/Messaging/ 405(方法不允许)

本文关键字:方法 不允许 api Messaging POST | 更新日期: 2023-09-27 18:33:58

我有一些角度试图发布到Web API。我以前已经工作过了,但一直遇到 CORS 的问题。

我已经把它放在global.asax中

protected void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
                HttpContext.Current.Response.End();
            }
        }

这是 API 控制器操作签名:

 public void Post([FromBody]Message message)

[FromUri] 和 [FromBody] 都不起作用

我试过:

config.EnableCors(new EnableCorsAttribute("*", "*", "*"));

在 WebApiConfig 中.cs在删除 asax 文件中Application_BeginRequest代码时,我收到相同的消息,即:405(方法不允许(

和控制器:

 public class MessagingController : ApiController
    {
        private IMessagingRepository DataRepository;
        public MessagingController()
        {
            DataRepository = new DataRepositoryFactory().GetMessagingInstance();
        }
        public List<Message> Get([FromUri]MessageGetModel model)
        {
            var result = DataRepository.GetMessages(model.FromId, model.ToId);
            return result;
        }
        public Message Get(string messageId)
        {
            var result = DataRepository.GetMessage(messageId);
            return result;
        }
        public void Post([FromUri]Message message)
        {
            message.Id = ObjectId.GenerateNewId().ToString();
            DataRepository.GetDataRepository().Save(message);
            DataRepository.PostOrUpdateThread(message);
        }
}

POST /api/Messaging/ 405(方法不允许)

1- 将 [FromUri] 更改为 [FromBody],因为您通常通过消息正文而不是通过查询字符串发布数据,通常查询字符串用于 Get 请求。

2-从Application_BeginRequest中删除您的代码,因为 EnableCors 就足够了,它将添加允许标头,并且通过 Application_BeginRequest 代码再次添加它们,您会在响应中遇到同一标头的重复问题。

3-您可以将路由属性或路由前缀添加到您的方法/控制器中,以便对于您的Post方法,将其替换为如下所示的内容:

[Route("api/Messaging")]
public void Post([FromBody]Message message)
{
    message.Id = ObjectId.GenerateNewId().ToString();
    DataRepository.GetDataRepository().Save(message);
    DataRepository.PostOrUpdateThread(message);
}

4-使用提琴手或邮递员进行测试,并确保以JSON格式或URL编码将消息添加到请求正文中。

5-如果将上一点中的消息设置为JSON格式,请确保使用将"内容类型"标头设置为"application/

json",或者如果您在上一点中对消息对象进行了编码,请确保将内容类型标头设置为"application/x-www-form-urlencoded"。

6-最后,您需要确保您的请求URL发布到yourapilocatio/api/Messaging url。

另外,你可以在这里看到我的答案。

希望这有帮助。