我有一些尝试发布到网络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("*", "*", "*"));
在asA文件中删除Application_BeginRequest代码时,在WebApiConfig.cs中,我收到的消息是: 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);
}
}
答案 0 :(得分:0)
1-将[FromUri]更改为[FromBody],因为您通常不通过查询字符串通过邮件正文发布数据,通常查询字符串用于Get请求。
2-从Application_BeginRequest中删除您的代码因为EnableCors已经足够了,它将添加Allow标头,并且通过Application_BeginRequest的代码再次添加它们,您会在响应中遇到重复相同标头的问题。
3-您可以将Route Attribute或RoutePrefix添加到您的方法/控制器中,以便对于Post方法,将其替换为如下所示:
[Route("api/Messaging")]
public void Post([FromBody]Message message)
{
message.Id = ObjectId.GenerateNewId().ToString();
DataRepository.GetDataRepository().Save(message);
DataRepository.PostOrUpdateThread(message);
}
4-使用Fiddler或postman进行测试,并确保以JSON格式或网址编码将消息添加到请求正文中。
5-确保使用设置&#34;内容类型&#34;标题为&#34; application / json&#34;如果您将上一点中的消息设置为JSON格式,或者将内容类型标题设置为&#34; application / x-www-form-urlencoded&#34;如果你在前一点编码了消息对象。
6-最后,您需要确保您的请求网址发布到yourapilocatio / api / Messaging网址。
另外,您可以看到我的回答here。
希望这有帮助。